C# WPF Button:如何向命令传递两个参数?
解决方法
要实现Button绑定命令并传入Item和SubItem两个实例,确实可以通过创建辅助类封装参数的方式完成,具体步骤如下:
1. 创建参数封装类
首先定义一个简单的类,用来同时承载Item和SubItem实例:
public class ItemSubItemPair { public Item ParentItem { get; set; } public SubItem CurrentSubItem { get; set; } }
2. 创建多值转换器
因为需要在XAML中同时绑定两个数据源(上层的Item和当前的SubItem),需要实现IMultiValueConverter来把这两个值转换成ItemSubItemPair实例:
using System.Globalization; using System.Windows.Data; public class ItemSubItemPairConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values.Length == 2 && values[0] is Item item && values[1] is SubItem subItem) { return new ItemSubItemPair { ParentItem = item, CurrentSubItem = subItem }; } return null; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
3. 调整ViewModel的命令定义
修改RelayCommand的类型,使其接受ItemSubItemPair作为参数,并调整命令执行逻辑:
class ViewModel { public ViewModel() { Items = new ObservableCollection<Item>(); } public ObservableCollection<Item> Items { get; set; } // 改为接受ItemSubItemPair类型的RelayCommand public RelayCommand<ItemSubItemPair> Command => new RelayCommand<ItemSubItemPair>(ExecuteCommand, _ => true); private void ExecuteCommand(ItemSubItemPair pair) { SomeMethod(pair.ParentItem, pair.CurrentSubItem); } private void SomeMethod(Item item, SubItem subItem) { // 原有的方法逻辑 } }
4. 修改XAML绑定
4.1 声明转换器资源
在Window/UserControl的资源中添加转换器的引用(假设转换器在local命名空间下):
<Window.Resources> <local:ItemSubItemPairConverter x:Key="ItemSubItemPairConverter"/> </Window.Resources>
4.2 调整Button的命令和参数绑定
修改DataGridTemplateColumn中的Button,完成命令绑定(指向ViewModel的Command)和多参数传递:
<DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Command="{Binding DataContext.Command, RelativeSource={RelativeSource AncestorType=ItemsControl}}"> <Button.CommandParameter> <MultiBinding Converter="{StaticResource ItemSubItemPairConverter}"> <!-- 绑定上层的Item实例(DataGrid的DataContext) --> <Binding RelativeSource="{RelativeSource AncestorType=DataGrid}" Path="DataContext"/> <!-- 绑定当前的SubItem实例(Button自身的DataContext) --> <Binding/> </MultiBinding> </Button.CommandParameter> <TextBlock Text="x"/> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
注意事项
- 确保
Item和SubItem中的成员是属性而非字段(比如public string Name { get; set; }),WPF绑定仅支持属性。 - 如果使用的RelayCommand不支持泛型参数,需要调整RelayCommand的实现,使其能接收自定义类型的参数。
内容的提问来源于stack exchange,提问作者mmdn
相关产品推荐
相关产品推荐

