C# WPF-捕获添加到样式(ListBoxItem)的按钮的单击

C# WPF-捕获添加到样式(ListBoxItem)的按钮的单击,c#,wpf,events,styles,C#,Wpf,Events,Styles,我为ListBoxItem的模板添加了一个按钮。我想知道如何捕捉按钮的点击(而不是选择ListboxItem) 按钮在UI中点击得很好,但我似乎无法找到如何连接代码以便捕获它 我尝试使用: <EventSetter Event="Click" Handler="Button_Click"></EventSetter> 但这似乎是我们想要的。我找不到办法把它接到按钮上 以下是我正在使用的样式,以防它有所帮助: <Window x:Class="WIAssista

我为ListBoxItem的模板添加了一个按钮。我想知道如何捕捉按钮的点击(而不是选择ListboxItem)

按钮在UI中点击得很好,但我似乎无法找到如何连接代码以便捕获它

我尝试使用:

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

但这似乎是我们想要的。我找不到办法把它接到按钮上

以下是我正在使用的样式,以防它有所帮助:

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

-
... (在后面代码中的网格中)

任何捕捉按钮点击的方法都将不胜感激。(注意,仅向按钮添加单击事件会出现一个错误,即使用
事件设置器

如果您的模板被设置为数据模板,可能通过模板选择器,您可以将ICommand绑定到按钮,然后在presenter/视图模型/任何对象中处理命令的执行


除此之外,我不确定,尽管我不是WPF专家。

事件处理程序的问题似乎是样式内部的样式。也请将样式保留在窗口资源中,尝试以下操作:

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

-
+



模板中的EventSetter也可以工作,但VS中的设计视图显然停止工作。

我也不是WPF专家。您所说的大部分内容对我来说都不具体。也许可以举个例子?查看Prism(来自Microsoft Patterns&Practices)这是一个很好地理解视图模型和命令的例子——它编译了吗?我也说到了这一点。但当我编译并运行它时,我说我需要使用EventHandler(因为它在样式模板中)是的,它编译和运行没有问题。我会立即发布代码。顺便说一句,我正在使用.NET 3.5.Ah,我应该发布更多的代码。我的错。我发布的XAML已经存在。我将用更多的XAML更新我的帖子。我将查看你发布的代码。也许我会那样使用它。问题似乎是st内部的风格yle…但是,您仍然可以使用键在窗口样式中将该模板声明为数据模板,然后将其指定为列表框的项目模板。更新响应:)
<ListBox ItemTemplate="{StaticResource ListBoxItemTemplate}" />