来自绑定的 DataTemplate 按钮命令

DataTemplate button command from binding

我正在使用 Wpf,我正在将 List<Value> 传递给 xaml 中的 <ItemsControl>。我想将 Value 对象中的 string 绑定到按钮的命令。 xaml 部分如下所示:

    <Grid Margin="0,0,2,0">
    <Grid Margin="10">
        <ItemsControl Name="details">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,0,0,5">
                        <Grid.ColumnDefinitions>
                            ....
                        </Grid.ColumnDefinitions>
                        ...
                        <Button Grid.Column="2"
                                Content="{Binding ButtonContent}"
                                Visibility="{Binding ButtonVisibility}"
                                Command="{Binding ButtonClickMethod}" />
        ...

我的 Value Class 看起来像这样:

public class Value
{        
    ...
    public string ButtonClickMethod { get; set; }

}

我将字符串 link 设置为:

v.ButtonClickMethod = "RelatedActivityId_OnClick";

方法在同一个 class 中,看起来像这样:

private void RelatedActivityId_OnClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("RelatedActivityId_OnClick");
    }

除此之外的一切都正常工作,并且为绑定取消了相同的对象。 我做错了什么?

按钮的 Command 属性 是 ICommand 类型,因此您不能将它绑定到 string 值。

您需要将 ButtonClickMethod 更新为 ICommand 类型或创建一个新的 属性 以将您 Command 绑定到。

有关 ICommand 的示例实现,请参阅 this 答案。

如果您需要按钮根据参数(字符串值?)执行代码,那么您可以使用 CommandParameter 属性,然后在命令处理程序中使用该参数。

public class Value
{        
    public Value()
    {
        ButtonCommand  = new RelayCommand((a) => true, CommandMethod); 
    }

    public RelayCommand ButtonCommand {get; set; }
    public string ButtonClickMethod { get; set; }

    private void CommandMethod(object obj)
    {
        MessageBox.Show(obj?.ToString());
    }
}

和XAML:

<Button Grid.Column="2"
         Content="{Binding ButtonContent}"
         Visibility="{Binding ButtonVisibility}"
         Command="{Binding ButtonCommand}"
         CommandParameter="{Binding ButtonClickMethod}" />

Button.Command 属性 仅绑定到实现 ICommand 接口的对象。 如果要调用名称为 ButtonClickMethod 的方法,则必须:

  1. 创建一个实现 ICommand 接口的 class。
  2. 创建一个对象 class 并将其绑定到您的按钮(绑定到 Button.Command)。
  3. 将 Value.ButtonClickMethod 作为 CommandParameter 传递给您的 ICommand 对象。
  4. 使用它来调用您想要的任何方法。