これは非常に長く脱出しており、実際には首尾一貫した質問をしないため、次のようになります。
1:ビューモデルにプライマリオブジェクトのサブプロパティを実装する適切な方法は何ですか?
2:delegatecommand.RaiseCanExecuteChangedの問題を修正する方法を見つけた人はいますか?または、MSが修正するまで自分で修正する必要がありますか?
話の残りの間...続けてください。
私のviewmodelには、EFPOCOオブジェクトであるModel.Doctorに関連付けられたdoctorオブジェクトプロパティがあります。セッターに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
WHOLEオブジェクトが変更された場合にのみ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
これはKarlShiffletのXAMLPowerToysコントロールから取得されているため、正しいと想定する必要があります。しかし、私の人生のために、私はそれを機能させることができません。
ビューをインスタンス化するためにユニティコンテナを使用しており、シングルトンであるため、ここにPRISMを含めました。eventaggregatorを介してビューモデルへの変更通知を受け取ります。eventaggregatorはDoctorに新しい値を入力します。私がこれをすべて行っている理由は、PRISMのDelegateCommandのためです。だから多分それは私の本当の問題です。
DelegateCommandには、それを実装するコマンドでRaiseCanExecuteChangedメソッドを起動しないバグがあるため、手動で起動する必要があるようです。そのためのコードがonPropertyChangedEventHandlerにあります。もちろん、これはICommandインターフェイスを介して実装されていないため、各コマンドのRaiseCanExecuteChangedにアクセスできるように、プロパティをDelegateCommand(Xの)にする必要があります。