在我的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的最优雅方式是什么?
在SelectedPerson
的setter中添加和删除属性更改的处理程序对我来说似乎有些混乱。
答案 0 :(得分:1)
在SelectedPerson的setter中添加和删除属性更改处理程序对我来说似乎有点乱。
我是怎么做的,而且我不确定什么是更清洁的选择。如果命令状态取决于子属性,则需要观察以某种方式的更改。但是,请注意取消订阅,否则如果Person
超过您的视图模型,则可能会导致内存泄漏。如果您无法保证取消订阅,则PropertyChangedEventManager
和弱事件处理程序可以提供帮助。
为了保持清洁,我通常只有一个侦听任何子属性更改的处理程序,它调用RequeryCommands
方法(也直接由视图模型方法调用),后者又调用{{1} } all 我视图中的命令。