2013-09-23 3 views
2

Код ниже не работает, когда я выбираю элемент в списке, знаете ли вы, почему?Listbox SelectionChanged не работает с Button в его ItemTemplate

<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 выглядит следующим образом

<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' private void selection_changed (object sender, SelectionChangedEventArgs e) { MessageBox.Show (" works? "); } 'code', но ничего не отображается. – Maximus

+0

Вы пытались использовать другой элемент управления вместо кнопки в таблице данных? – cguedel

ответ

1

SelectionChanged события не обожженное, поскольку кнопка управления, который захватывает мышь, а не ListBox.

Вместо этого вы можете настроить обработчик событий на событие нажатия кнопки.

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

Независимо от того, я рекомендую вам использовать MVVM вместо Code-Behind обработчик события.

можно установить команду, которая будет срабатывать, когда кнопки мыши и отправить команду содержимое баттона, например

<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> 

ViewModel

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

}); 

Если вы не знаком с MVVM, он будет принимать некоторое время, чтобы узнать это, но это определенно стоит :)

+0

Мое упущение, я ничего не изменил. – Maximus

+0

@ user2396510 Приносим извинения, что ответ был неудачным, я отклонил свой ответ –

+0

Спасибо, теперь это работает, как вы пришли к этой идее? – Maximus

1

Вы можете добавить обработчик события PreviewMouseDown в ListBoxItem:

<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; 
    } 
Смежные вопросы