有点迷惑
如果我在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);
}到目前为止,这对我来说似乎还不错,唯一缺少的是为SelectedReport的设置器中的特定按钮引发一个CanExecute事件
CommandDelete.RaiseCanExecuteChanged();这是可行的,但我的问题是,如果我有10个按钮,我是否需要在每次选择一个项目时为每个按钮调用RaiseCanExecuteChanged,或者以更智能的方式存在
发布于 2012-02-02 03:10:54
通常我会将我的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。我会假设存在性能差异,但我从未注意到这一点。
https://stackoverflow.com/questions/9101416
复制相似问题