有点困惑
如果我在wpf窗口中有一个按钮并将其绑定到DelegateCommand
<Button Grid.Row="1" Content="Remove" Command="{Binding CommandDelete }" />
在我简单的viewmodel中,我附上
CommandDelete = new DelegateCommand<string>(OnDeleteExecute, OnDeleteCanExecute);
如果我从列表中选择项目时要启用该按钮,我可以将列表selecteditem绑定到我的viewmodel中的属性
Report selectedReport;
public Report SelectedReport
{
get { return this.selectedReport ;}
set { this.selectedReport = value;}
}
private bool OnDeleteCanExecute(string commandParameter)
{
return (this.selectedReport != null);
}
到目前为止,这对我来说似乎很好,唯一缺少的是为SelectedReport的setter中的特定按钮引发CanExecute事件
CommandDelete.RaiseCanExecuteChanged();
这有效,但我的问题是,如果我有10个按钮,我需要每次选择一个项目时为每个按钮调用RaiseCanExecuteChanged,或者是否有更智能的方式
答案 0 :(得分:1)
通常我会将RaiseCanExecuteChanged()
放在该班级的PropertyChanged
事件中。
例如,如果DeleteCommand.CanExecute
基于SelectedReport
属性,我会挂钩PropertyChanged
的{{1}}事件并提升ViewModel
事件随时CanExecuteChanged
发生变化。
SelectedReport
这将所有逻辑保存在一个中心位置,并确保只要其中一个参数发生变化就会引发void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "SelectedReport")
DeleteCommand.RaiseCanExecuteChanged();
}
。
另一种方法是从使用CanExecuteChanged
切换到DelegateCommand
,当属性发生变化时会自动将其抬起RelayCommand
。我认为存在性能差异,但从未注意到一个。