[英]Enable DelegateCommand
有点不解
如果我在wpf窗口中有一个按钮并将其绑定到DelegateCommand
<Button Grid.Row="1" Content="Remove" Command="{Binding CommandDelete }" />
在我简单的视图模型中
CommandDelete = new DelegateCommand<string>(OnDeleteExecute, OnDeleteCanExecute);
如果从列表中选择一个项目时要启用按钮,则可以将列表中的selecteditem绑定到视图模型中的属性
Report selectedReport;
public Report SelectedReport
{
get { return this.selectedReport ;}
set { this.selectedReport = value;}
}
private bool OnDeleteCanExecute(string commandParameter)
{
return (this.selectedReport != null);
}
到目前为止,这对我来说似乎还不错,唯一缺少的是为SetterReport的设置器中的特定按钮引发CanExecute事件
CommandDelete.RaiseCanExecuteChanged();
这是可行的,但我的问题是,如果我有10个按钮,那么每次选择一个项目时,是否需要为每个按钮调用RaiseCanExecuteChanged?
通常,我将RaiseCanExecuteChanged()
放在该类的PropertyChanged
事件中。
例如,如果DeleteCommand.CanExecute
基于SelectedReport
属性,则我将钩接到ViewModel
的PropertyChanged
事件中,并在SelectedReport
发生更改时引发CanExecuteChanged
事件。
void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "SelectedReport")
DeleteCommand.RaiseCanExecuteChanged();
}
这将所有逻辑都放在一个中央位置,并确保只要其中一个参数发生更改, CanExecuteChanged
就会引发。
另一种选择是从使用DelegateCommand
切换到RelayCommand
,当属性更改时,它会自动引发其CanExecuteChanged
。 我以为会有性能差异,但是从来没有注意到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.