繁体   English   中英

启用DelegateCommand

[英]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属性,则我将钩接到ViewModelPropertyChanged事件中,并在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM