首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启用DelegateCommand

启用DelegateCommand
EN

Stack Overflow用户
提问于 2012-02-02 02:46:23
回答 1查看 516关注 0票数 0

有点迷惑

如果我在wpf窗口中有一个按钮并将其绑定到DelegateCommand

代码语言:javascript
复制
<Button Grid.Row="1"  Content="Remove" Command="{Binding CommandDelete }" />

在我的简单视图模型中,我附加了

代码语言:javascript
复制
CommandDelete = new DelegateCommand<string>(OnDeleteExecute, OnDeleteCanExecute);

如果要在从列表中选择项时启用该按钮,则可以将列表selecteditem绑定到视图模型中的属性

代码语言:javascript
复制
Report selectedReport;
            public Report SelectedReport
            {
                get { return this.selectedReport ;}
                set { this.selectedReport = value;}
            }
private bool OnDeleteCanExecute(string commandParameter)
            {
                return (this.selectedReport != null);
            }

到目前为止,这对我来说似乎还不错,唯一缺少的是为SelectedReport的设置器中的特定按钮引发一个CanExecute事件

代码语言:javascript
复制
CommandDelete.RaiseCanExecuteChanged();

这是可行的,但我的问题是,如果我有10个按钮,我是否需要在每次选择一个项目时为每个按钮调用RaiseCanExecuteChanged,或者以更智能的方式存在

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-02 03:10:54

通常我会将我的RaiseCanExecuteChanged()放在该类的PropertyChanged事件中。

例如,如果DeleteCommand.CanExecute基于SelectedReport属性,我将挂钩到ViewModelPropertyChanged事件,并在SelectedReport发生更改时引发CanExecuteChanged事件。

代码语言:javascript
复制
void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "SelectedReport")
        DeleteCommand.RaiseCanExecuteChanged();
}

这使得所有的逻辑都集中在一个中心位置,并确保每当其中一个参数发生变化时,就会引发CanExecuteChanged

另一种选择是从使用DelegateCommand切换到RelayCommand,当属性发生变化时,它会自动引发它的CanExecuteChanged。我会假设存在性能差异,但我从未注意到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9101416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档