在Prism框架下,提供了DelegateCommand类用于处理了UI的按键请求,XAML中可以直接采用 Command="{Binding **}" 来绑定这些方法。这个类是一个泛型的类生命时仅需要DelegateCommand<T>即可,同时在XAML中绑定CommandParameter"{Binding **}"
(1)模板的类型问题:
但是今天在写代码时出现了一个错误:
System.InvalidCastException:“T for DelegateCommand<T> is not an object nor Nullable.”
这个错误的根本原因是 DelegateCommand<T> 需要 T 类型的参数是一个引用类型(即类类型或者 Nullable<T> 类型)。int 是一个值类型,所以会遇到 InvalidCastException 错误。
修改方案:
可以将DelegateCommand<int> 更改DelegateCommand<int?> 来避免 InvalidCastException,因为 int? 是 int 的可空类型,它被认为是引用类型。
// 这里的T参数类型从 int 改为 int?,即 Nullable<int>
public DelegateCommand<int?> SendFilterConfig { get; private set; }// 在构造方法或初始化时创建命令
public YourViewModel()
{SendFilterConfig = new DelegateCommand<int?>(ExecuteSendFilterConfig);
}// 执行命令时处理 int? 类型的 id
private void ExecuteSendFilterConfig(int? id)
{if (id.HasValue){// 执行逻辑,例如发送设置Console.WriteLine($"发送设置,ID: {id.Value}");}
}
(2)ItemControl中的按键绑定问题:
在WPF中,DataGridTemplateColumn中的按钮绑定通常会绑定到行项(item)本身,而不是ViewModel,这是因为Button的Command和CommandParameter默认绑定到当前数据上下文,即当前行的item。为了让命令绑定到ViewModel而不是当前项,需要确保按钮的DataContext设置为ViewModel,而不是当前的item。
修改方案:
确保DataContext指向ViewModel:在Button的Command绑定中,将Command绑定到ViewModel而不是item。你可以通过使用RelativeSource绑定来实现这一点。
<Button Content="发送" Command="{Binding DataContext.SendFilterConfig, RelativeSource={RelativeSource AncestorType=DataGrid} }" CommandParameter="{Binding ID}" Style="{StaticResource elButton}" />