3

私のViewModel中には、ObservableCollectionPersonを実装する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れるたびに MyCommand.RaiseCanExecuteChanged を呼び出す最もエレガントな方法は何ですか?SelectedPerson

のセッターでプロパティが変更されたハンドラーを追加および削除するSelectedPersonのは、私には少し面倒です。

4

1 に答える 1

1

SelectedPerson のセッターでプロパティが変更されたハンドラーを追加および削除することは、私には少し面倒に思えます。

それが私のやり方であり、よりクリーンな代替手段が何であるかはわかりません。コマンドの状態がサブプロパティに依存している場合は、何らかの方法で変更を観察する必要があります。ただし、サブスクライブの解除には注意してください。そうしないとPerson、ビュー モデルが期限切れになるとメモリ リークが発生する危険があります。 PropertyChangedEventManagerまた、サブスクライブ解除を保証できない場合は、弱いイベント ハンドラーが役立ちます。

物事をきれいに保つために、通常、サブプロパティの変更をリッスンするハンドラーを 1 つだけ用意します。このハンドラーはRequeryCommandsメソッドを呼び出し (ビュー モデル メソッドによっても直接呼び出されます) RaiseCanExecuteChanged、ビュー内のすべてのコマンドを呼び出します。

于 2014-10-24T20:51:49.063 に答える