3

在我的ViewModel我有一个ObservableCollection对象Person(实现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 的​​最优雅方式是什么?

在 setter 中添加和删除属性更改的处理程序SelectedPerson对我来说似乎有点混乱。

4

1 回答 1

1

在 SelectedPerson 的设置器中添加和删除属性更改的处理程序对我来说似乎有点混乱。

我就是这样做的,我不确定有什么更清洁的选择。如果命令状态依赖于子属性,则需要以某种方式观察变化。但是,请注意取消订阅,否则如果您Person的视图模型超过您的视图模型,您将面临内存泄漏的风险。 PropertyChangedEventManager如果您不能保证退订,弱事件处理程序可以提供帮助。

为了保持干净,我通常只有一个处理程序来侦听任何子属性更改,该处理程序调用一个RequeryCommands方法(也由视图模型方法直接调用),该方法反过来调用我视图中RaiseCanExecuteChanged所有命令。

于 2014-10-24T20:51:49.063 回答