WPF - поймать нажатие кнопки, которая была добавлена ​​в стиль (ListBoxItem) - PullRequest
1 голос
/ 01 декабря 2009

Я добавил кнопку в шаблон для ListBoxItem. Я хочу знать, как отловить нажатие кнопки (не выбирая ListboxItem).

Кнопка очень хорошо нажимает в интерфейсе, но я не могу понять, как подключить код, чтобы я мог его поймать.

Я пытался использовать:

<EventSetter Event="Click" Handler="Button_Click"></EventSetter>

но, похоже, он хочет быть в ListBoxItem. Я не мог найти способ подключить его к кнопке.

Вот стиль, с которым я работаю, если он помогает:

<Window x:Class="WIAssistant.Main"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="My App" Height="587" Width="1246" Name="MainForm" FontSize="14">

<Window.Resources>
  <Style x:Key="CheckBoxListStyle" TargetType="ListBox">
     <Style.Resources>
        <Style TargetType="ListBoxItem">
          <Setter Property="Template">
             <Setter.Value>
                 <ControlTemplate TargetType="ListBoxItem">
                   <Grid ScrollViewer.CanContentScroll="True" Margin="2">
                      <Grid.ColumnDefinitions>
                      <ColumnDefinition Width="Auto" />
                      <ColumnDefinition Width="Auto" />
                      <ColumnDefinition Width="Auto" />
                      <ColumnDefinition />
                   </Grid.ColumnDefinitions>
                   <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsSelected,
                                                 RelativeSource={RelativeSource TemplatedParent},
                                                 Mode=TwoWay}" />
                   <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="{Binding Id}" />
                   <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="{Binding Title}" />
                   <Button HorizontalAlignment="Right" Grid.Column="3" Margin="5,0,5,0" Width="25">-&gt;</Button>
                 </Grid>
               </ControlTemplate>
             </Setter.Value>
          </Setter>
        </Style>
      </Style.Resources>
      <Setter Property="ItemsPanel">
        <Setter.Value>
           <ItemsPanelTemplate>
             <WrapPanel Orientation="Vertical"  />
           </ItemsPanelTemplate>
         </Setter.Value>
      </Setter>
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Background" Value="Transparent" />
  </Style>
</Window.Resources>

... (In a grid in later code)

 <ListBox SelectionMode="Multiple" Style="{StaticResource CheckBoxListStyle}"
          Name="lstQueryResults" SelectionChanged="lstQueryResults_SelectionChanged">
 </ListBox>

Был бы признателен любой способ зафиксировать нажатие кнопки. (Обратите внимание, что простое добавление события нажатия на кнопку приводит к ошибке, говорящей об использовании EventSetter.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Кажется, проблема для обработчика событий - это стиль изнутри. Чтобы сохранить стиль в ресурсах окна, попробуйте следующее:

<Window.Resources>
    <DataTemplate x:Key="ListBoxItemTemplate">
        <Grid ScrollViewer.CanContentScroll="True" Margin="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsSelected, Mode=TwoWay}" />
            <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="{Binding Id}" />
            <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="{Binding Title}" />
            <Button HorizontalAlignment="Right" Grid.Column="3" Margin="5,0,5,0" Width="25" Click="Button_Click">-&gt;</Button>
        </Grid>
    </DataTemplate>
</Window.Resources>

+

<ListBox ItemTemplate="{StaticResource ListBoxItemTemplate}" />

EventSetter в шаблоне также работает, но, по-видимому, перестает работать представление дизайна в VS.

0 голосов
/ 01 декабря 2009

Если ваш шаблон был установлен как шаблон данных, возможно, с помощью селектора шаблонов, вы можете привязать ICommand к кнопке, а затем обработать выполнение команды в вашем презентере / модели представления / что угодно.

Помимо этого, я не уверен, хотя я не эксперт по WPF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...