带有按钮的 WPF 列表框样式

Posted

技术标签:

【中文标题】带有按钮的 WPF 列表框样式【英文标题】:WPF Listbox style with a button 【发布时间】:2010-09-06 21:14:37 【问题描述】:

我有一个为 ListBoxItems 定义了样式的 ListBox。在这种风格中,我有一些标签和一个按钮。一个那个按钮,我想定义一个可以在我的页面(或使用该样式的任何页面)上处理的单击事件。如何在我的 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>

谢谢!

【问题讨论】:

【参考方案1】:

看看RoutedCommands。

在 myclass 中的某处定义您的命令,如下所示:

    public static readonly RoutedCommand Login = new RoutedCommand();

现在用这个命令定义你的按钮:

    <Button Command="x:Static myclass.Login"  />  

您可以使用 CommandParameter 获取更多信息..

现在最后但同样重要的是,开始听你的命令:

在类的构造函数中你希望做一些好事情,你放置:

    CommandBindings.Add(new CommandBinding(myclass.Login, ExecuteLogin));

或在 XAML 中:

   <UserControl.CommandBindings>
        <CommandBinding Command="x:Static myclass.Login" Executed="ExecuteLogin" />
   </UserControl.CommandBindings>

然后你实现 CommandBinding 需要的委托:

    private void ExecuteLogin(object sender, ExecutedRoutedEventArgs e)
    
          //Your code goes here... e has your parameter!
    

你可以在你的可视化树的任何地方开始收听这个命令!

希望对你有帮助

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

PPS 下面是另一个例子:RoutedCommands in WPF

【讨论】:

【参考方案2】:

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

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

<ListBox Button.Click="removeButtonClick" ... />

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

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

【讨论】:

【参考方案3】:

您可以创建一个用户控件 (.ascx) 来容纳列表框。然后为页面添加公共事件。

Public Event btnRemove()

然后在用户控件中的按钮点击事件

RaiseEvent btnRemove()

您也可以像任何其他方法一样通过事件传递对象。这将允许您的用户控件告诉您的页面要删除的内容。

【讨论】:

以上是关于带有按钮的 WPF 列表框样式的主要内容,如果未能解决你的问题,请参考以下文章

WPF:删除样式列表框中焦点项目周围的虚线边框

WPF 列表框动态填充 - 如何让它刷新?

WPF中的数据绑定单选按钮列表

带有彩色项目的 wpf 列表框

使用 WrapPanel 和 ScrollViewer 在 WPF 中提供多列列表框

WPF:仅当列表框中的一项被选中时才启用按钮