将事件绑定到使用WPF中的数据模板创建的控件

时间:2017-06-26 13:17:16

标签: c# wpf event-handling datatemplate

在我的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中的事件处理程序。当我使用数据模板创建列时,当然无法访问为每行创建的按钮。

处理以所述方式创建的按钮的点击事件的最佳方法是什么?

提前致谢,
弗兰克

2 个答案:

答案 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