因为这是这么长和脱垂,真的没有问一个连贯的问题:
1:在视图模型中实现主要对象的子属性的正确方法是什么?
2:有没有人找到解决delegatecommand.RaiseCanExecuteChanged 问题的方法?还是我需要自己修复它,直到 MS 修复?
对于故事的其余部分......继续。
在我的视图模型中,我有一个与我的 Model.Doctor 相关联的医生对象属性,它是一个 EF POCO 对象。我在 setter 中有 onPropertyChanged("Doctor") :
Private Property Doctor() As Model.Doctor
Get
Return _objDoctor
End Get
Set(ByVal Value As Model.Doctor)
_objDoctor = Value
OnPropertyChanged("Doctor")
End Set
End Property
如果整个对象发生更改,则唯一一次触发 OnPropertyChanged。除了我需要知道医生的属性何时更改之外,这不会是一个问题,以便我可以在我的表单上启用其他控件(例如保存按钮)。我试图以这种方式实现它:
Public Property FirstName() As String
Get
Return _objDoctor.FirstName
End Get
Set(ByVal Value As String)
_objDoctor.FirstName = Value
OnPropertyChanged("Doctor")
End Set
End Property
这是从 Karl Shifflet 的 XAMLPowerToys 控件中获取的,所以我必须假设它是正确的。但是对于我的生活,我无法让它发挥作用。
我在这里包含了 PRISM,因为我使用一个统一容器来实例化我的视图,它是一个单例。我通过 eventtaggregator 收到视图模型的更改通知,然后用新值填充 Doctor。我做这一切的原因是因为 PRISM 的 DelegateCommand。所以也许这是我真正的问题。
似乎 DelegateCommand 中有一个错误,它不会在实现它的命令上触发 RaiseCanExecuteChanged 方法,因此需要手动触发。我的 onPropertyChangedEventHandler 中有相应的代码。当然,这也不是通过 ICommand 接口实现的,所以我必须打破并制作我的属性 DelegateCommand(of X) 以便我可以访问每个命令的 RaiseCanExecuteChanged。