2013-09-23 1 views
2

목록 상자에서 항목을 선택하면 아래 코드가 작동하지 않습니다. 그 이유는 무엇입니까? 버튼은 마우스 클릭이 아닌 ListBox을 캡처 제어를하기 때문에ListBox SelectionTagate의 Button으로 작업하고 있지 않습니다.

<ListBox BorderBrush="Transparent" Background="Transparent" Name="listbox" HorizontalAlignment="Center" VerticalAlignment="Center" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionChanged="selection_changed"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel/> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Button Height="90" Width="150" Template="{StaticResource cbutton}"/>     
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

그리고 템플릿를 CButton는 SelectionChanged 이벤트가 발생되지 않습니다

<ControlTemplate x:Key="cbutton" TargetType="Button"> 
      <Border CornerRadius="3" BorderThickness="3.5" BorderBrush="White"> 
       <Border.Background> 
        <LinearGradientBrush EndPoint="1,1" StartPoint="0,0"> 
         <GradientStop Color="DarkOrange" Offset="0.1"/> 
         <GradientStop Color="Orange" Offset="0.85"/> 
        </LinearGradientBrush> 
       </Border.Background> 
       <TextBlock FontWeight="ExtraBold" Foreground="White" TextAlignment="Center" TextWrapping="Wrap" FontSize="15" Text="{Binding name}" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
      </Border> 
     </ControlTemplate> 
+1

"작동하지 않는다"는 의미는 무엇입니까? 무슨 일이야? 오류가 있습니까? – iabbott

+0

다음과 같이 메시지가 표시되는지 확인했습니다. code void private selection_changed (Object sender, SelectionChangedEventArgs e) { MessageBox.Show ("works?"); }'code'하지만 아무것도 표시되지 않습니다. – Maximus

+0

데이터 형식의 단추 대신 다른 컨트롤을 사용하려고 했습니까? – cguedel

답변

1

것 같습니다.

이벤트 핸들러를 버튼의 클릭 이벤트로 설정할 수 있습니다.

<Button Height="90" Width="150" Click="myClickEventHandler"/> 

에 관계없이, 당신이 대신 이벤트 코드 숨김 핸들러의, MVVM를 사용하는 것이 좋습니다.

당신이 MVVM와 익숙하지 않으면 뷰 모델

DoSomething = new DelegateCommand<object>(content=> 
{ 
    // Do whatever you want 

}); 

을 발사 할 때 버튼의 클릭 예를

<Button Name="myButton" Height="90" Width="150" Template="{StaticResource cbutton}">  
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
        <i:InvokeCommandAction Command="{Binding DoSomething}" CommandParameter="{Binding ElementName=myButton, Path=Content}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Button> 

에 대한 명령을 버튼의 내용을 보내드립니다 명령을 설정할 수

,이 소요됩니다 언젠가 그것을 배울 수 있지만 그것은 definetly 가치가있다 :)

+0

내 누락, 내가 편집 한 게 아무것도 변경되지 않았습니다. – Maximus

+0

@ user2396510 내 사과, 그 대답은 좋지 않았어, 내 대답을 바꿨다 –

+0

고마워 지금은 어떻게 작동 했니? – Maximus

1

ListBoxItem에 대한 PreviewMouseDown 이벤트 처리기를 추가 할 수 있습니다 :

<ListBox ItemsSource="{Binding ListBoxItemsSource}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Button Content="{Binding}" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <EventSetter Event="PreviewMouseDown" 
          Handler="ItemOnPreviewMouseDown" /> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 


    private void ItemOnPreviewMouseDown(
     object sender, MouseButtonEventArgs e) 
    { 
     ((ListBoxItem) sender).IsSelected = true; 
    }