带按钮的WPF列表框样式

Sco*_*ttG 7 c# wpf

我有一个ListBox,它具有为Lis​​tBoxItems定义的样式.在这种风格中,我有一些标签和一个按钮.一个按钮,我想定义一个可以在我的页面(或任何使用该样式的页面)上处理的点击事件.如何在我的WPF页面上创建一个事件处理程序来处理我的ListBoxItems样式的事件?

这是我的风格(仅受影响的代码):

<Style x:Key="UsersTimeOffList"  TargetType="{x:Type ListBoxItem}">
... 
<Grid>
<Button x:Name="btnRemove" Content="Remove" Margin="0,10,40,0" Click="btnRemove_Click" />
</Grid>
</Style>
Run Code Online (Sandbox Code Playgroud)

谢谢!

Arc*_*rus 10

看看RoutedCommand.

在myclass中的某个地方定义你的命令,如下所示:

    public static readonly RoutedCommand Login = new RoutedCommand();
Run Code Online (Sandbox Code Playgroud)

现在使用此命令定义您的按钮:

    <Button Command="{x:Static myclass.Login}"  />  
Run Code Online (Sandbox Code Playgroud)

您可以使用CommandParameter获取额外信息.

现在最后但并非最不重要的是,开始听你的命令:

在这个类的构造函数中,你希望做一些不错的东西,你放置:

    CommandBindings.Add(new CommandBinding(myclass.Login, ExecuteLogin));
Run Code Online (Sandbox Code Playgroud)

或者在XAML中:

   <UserControl.CommandBindings>
        <CommandBinding Command="{x:Static myclass.Login}" Executed="ExecuteLogin" />
   </UserControl.CommandBindings>
Run Code Online (Sandbox Code Playgroud)

并实现CommandBinding所需的委托:

    private void ExecuteLogin(object sender, ExecutedRoutedEventArgs e)
    {
          //Your code goes here... e has your parameter!
    }
Run Code Online (Sandbox Code Playgroud)

您可以在可视树中的任何地方开始收听此命令!

希望这可以帮助

PS你也可以使用CanExecute委托定义CommandBinding,如果CanExecute这样说,它甚至会禁用你的命令:)

PPS这是另一个例子:WPF中的RoutedCommands


Mat*_*ton 6

正如Arcturus发布的那样,RoutedCommands是实现这一目标的好方法.但是,如果DataTemplate中只有一个按钮,那么这可能会更简单一些:

您实际上可以从主机ListBox处理任何按钮的Click事件,如下所示:

<ListBox Button.Click="removeButtonClick" ... />
Run Code Online (Sandbox Code Playgroud)

ListBox中包含的任何按钮都会在单击它们时触发该事件.在事件处理程序中,您可以使用e.OriginalSource获取对单击按钮的引用.

显然,如果你的ListBoxItems有多个按钮,这太简单了,但在很多情况下它工作得很好.