C# 当模型更改时,Raise CANEXECUTE更改

C# 当模型更改时,Raise CANEXECUTE更改,c#,.net,wpf,mvvm,delegatecommand,C#,.net,Wpf,Mvvm,Delegatecommand,在我的ViewModel中,我有一个observedcollection的Person对象(实现INotifyPropertyChanged)和一个SelectedPerson属性。在我的视图中,它们被绑定到一个列表框 在我的ViewModel中还有以下Prism DelegateCommand: Private DelegateCommand _myCommand = New DelegateCommand(CanExecute) Public DelegateCommand MyComman

在我的
ViewModel
中,我有一个
observedcollection
Person
对象(实现
INotifyPropertyChanged
)和一个
SelectedPerson
属性。在我的视图中,它们被绑定到一个列表框

在我的ViewModel中还有以下Prism DelegateCommand:

Private DelegateCommand _myCommand = New DelegateCommand(CanExecute)
Public DelegateCommand MyCommand {get {return _myCommand;}}

Private Bool CanExecute()
{
    Return (SelectedPerson.Age > 40);
}
调用MyCommand.RaiseCanceChanged最优雅的方式是什么?当
所选人员
发生变化时,调用MyCommand.RaiseCanceChanged的方式是什么?当
所选人员
的年龄发生变化时,调用MyCommand.RaiseCanceTechChanged的方式是什么

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

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

我就是这样做的,我不确定什么是更清洁的替代品。如果命令状态依赖于子属性,则需要以某种方式观察更改。不过,在取消订阅时要小心,否则,如果您的
用户比视图模型寿命长,您就有内存泄漏的风险<如果无法保证取消订阅,则代码>属性更改开发管理器和弱事件处理程序可以提供帮助

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