来自绑定的 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 的方法,则必须:
- 创建一个实现 ICommand 接口的 class。
- 创建一个对象 class 并将其绑定到您的按钮(绑定到 Button.Command)。
- 将 Value.ButtonClickMethod 作为 CommandParameter 传递给您的 ICommand 对象。
- 使用它来调用您想要的任何方法。
我正在使用 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 的方法,则必须:
- 创建一个实现 ICommand 接口的 class。
- 创建一个对象 class 并将其绑定到您的按钮(绑定到 Button.Command)。
- 将 Value.ButtonClickMethod 作为 CommandParameter 传递给您的 ICommand 对象。
- 使用它来调用您想要的任何方法。