启用DelegateCommand

时间:2012-02-01 18:46:23

标签: c# wpf xaml button

有点困惑

如果我在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,或者是否有更智能的方式

1 个答案:

答案 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。我认为存在性能差异,但从未注意到一个。

相关问题