当模型改变时,触发Raise CanExecuteChanged。

3
在我的ViewModel中,我有一个Person对象的ObservableCollection(实现了INotifyPropertyChanged接口)和一个SelectedPerson属性。它们绑定到视图中的ListBox。此外,我的ViewModel还有以下Prism DelegateCommand:
Private DelegateCommand _myCommand = New DelegateCommand(CanExecute)
Public DelegateCommand MyCommand {get {return _myCommand;}}

Private Bool CanExecute()
{
    Return (SelectedPerson.Age > 40);
}

什么是最优雅的方式,在SelectedPerson更改SelectedPerson年龄更改时调用MyCommand.RaiseCanExecuteChanged?
SelectedPerson的setter中添加和删除属性更改处理程序似乎有点凌乱。
1个回答

1
在SelectedPerson的setter中添加和移除属性更改处理程序对我来说有点混乱。这就是我做的方式,我不确定是否有更清晰的替代方案。如果命令状态取决于子属性,则需要以某种方式观察更改。但是要小心取消订阅,否则如果您的Person超过了视图模型的生命周期,就会出现内存泄漏的风险。如果无法保证您取消订阅,则PropertyChangedEventManager和弱事件处理程序可以提供帮助。为了保持整洁,我通常只有一个处理程序监听任何子属性更改,该处理程序调用RequeryCommands方法(也由视图模型方法直接调用),然后为我的视图中的所有命令调用RaiseCanExecuteChanged。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接