我有一个ListBox,它具有为ListBoxItems定义的样式。在这种风格中,我有一些标签和一个按钮。一个按钮,我想定义一个可以在我的页面(或任何使用该样式的页面)上处理的点击事件。如何在我的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>
谢谢!
答案 0 :(得分:10)
看看RoutedCommand s。
在某个地方的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
答案 1 :(得分:6)
正如Arcturus发布的那样,RoutedCommands是实现这一目标的好方法。但是,如果DataTemplate中只有一个按钮,那么这可能会更简单一些:
您实际上可以从主机ListBox处理任何按钮的Click事件,如下所示:
<ListBox Button.Click="removeButtonClick" ... />
ListBox中包含的任何按钮都会在单击它们时触发该事件。在事件处理程序中,您可以使用e.OriginalSource获取对单击按钮的引用。
显然,如果你的ListBoxItems有多个按钮,这太简单了,但在很多情况下它运行得很好。
答案 2 :(得分:0)
您可以创建一个用户控件(.ascx)来容纳列表框。然后为该页面添加一个公共事件。
Public Event btnRemove()
然后在usercontrol中的按钮单击事件
RaiseEvent btnRemove()
您也可以像通过任何其他方法一样在事件中传递对象。这将允许您的用户控件告诉您的页面要删除的内容。