在我的WPF项目中,我在Code Behind中创建了一个自定义ListView。在此ListView中是一个包含按钮的列,由我的资源字典中的datatemplate定义。
<DataTemplate x:Key="DataTemplate_EditButton">
<Button Style="{DynamicResource Button_Image}" Width="25" ... />
</DataTemplate>
初始化ListView时,我使用以下代码创建列:
GridViewColumn buttonColumn = new GridViewColumn();
DataTemplate dt = Application.Current.TryFindResource("DataTemplate_EditButton") as DataTemplate;
buttonColumn.CellTemplate = dt;
...
gridView.Columns.Add(buttonColumn);
现在我想将事件处理程序绑定到按钮的click事件。我无法在模板中执行此操作,因为我需要在Dictionary的类后面创建一个代码,无论如何我都需要ListView-UserControl中的事件处理程序。当我使用数据模板创建列时,当然无法访问为每行创建的按钮。
处理以所述方式创建的按钮的点击事件的最佳方法是什么?
提前致谢,
弗兰克
答案 0 :(得分:3)
由于您的模板在许多控件之间共享 - 好的方法可能是使用路由命令。首先声明一个命令(或使用现有命令之一,例如来自ApplicationCommands
类):
public static class Commands {
public static RoutedCommand EditRow = new RoutedCommand("Edit", typeof(Commands));
}
在模板中使用此命令:
<DataTemplate x:Key="DataTemplate_EditButton">
<Button x:Name="button" Command="{x:Static my:Commands.EditRow}" />
</DataTemplate>
然后绑定到控件中的那个命令(在构造函数中):
this.CommandBindings.Add(new CommandBinding(Commands.EditRow, EditButtonClicked));
private void EditButtonClicked(object sender, ExecutedRoutedEventArgs args)
{
var button = args.OriginalSource;
// do what you need here
}
答案 1 :(得分:2)
处理以所述方式创建的按钮的点击事件的最佳方法是什么?
您需要等到实际创建Button
个元素才能附加事件处理程序。您可以通过处理StatusChanged
ListView
的{{1}}事件来执行此操作。
请参阅以下示例代码。它应该给你这个想法。
ItemContainerGenerator