带有按钮的 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 列表框样式的主要内容,如果未能解决你的问题,请参考以下文章