1

私の質問は、「ベストプラクティスは何ですか?」というものです。非常に特殊なケースでは、次のように入力します。

チェックボックスのリストボックスを含むビューがあります。

listbox.ItemsSourceは、 ViewModel (List of Person)のコレクションにバインドされます。そして、各checkbox.IsCheckedPerson.IsSelectedにバインドされています。

チェックボックスをオンまたはオフにすると、ViewModel の「Refresh」メソッドがアクティブになり、すべての Person の Person.IsChecked が再設定される場合とされない場合があります。もちろん、Person.IsChecked (変更されている可能性があります) が変更されたことを UI に通知する必要があります。

私の質問は次のとおりです: ViewMode.Refreshを呼び出す責任は誰にありますか? UI はイベントまたはコマンドを介してメソッドを呼び出す必要がありますか? または、ViewModelがPersonの適切なイベントにサブスクライブする必要があります。

4

4 に答える 4

3

UI が にバインドされている場合IsChecked、何も通知する必要はありません。というか、WPF 自体が通知します。それがMVVMの魅力の一つです。ビューモデルは、独自の一連のルールに従って状態を更新するだけで、ビューはバインディングを介してそれらの変更を自動的に受け取ります。

于 2013-09-13T11:58:25.813 に答える
1

「電話」の意味に応じて

ここに答えがあります

作成する場合:

  • 他のViewModel
  • ビューまたはモデルではないもの(それらのどれもあなたのVMを知っているべきではないため)

メソッドの実行について話している場合:

  • 自己実行 (たとえば、PropertyChanged、Command などの後)
  • 他のViewModel
  • ビューまたはモデルではないもの(それらのどれもあなたのVMを知っているべきではないため)

あなたの場合にも重要です:

リストが Collection にバインドされていると言いますが
、ビューがPerson.IsSelectedIsSelected の PropertyChanged を発生させるように変更されたため、ここで問題が発生する可能性があります。既知の問題であるアイテムのプロパティが変更された場合に通知されない
ため、スタックします。この問題を解決するには、イベントを からのイベントに接続する必要があります。したがって、VM にバブル アップし、彼の実行できます。ObservableCollectionINotifyPropertyChangedCollectionChangedObservableCollectionRefresh()

ここで、それを行う方法の例を見ることができます。

于 2013-09-13T14:04:56.737 に答える
0

イベントまたはコマンドを使用してビュー モデルを更新することをお勧めします。

コレクション メンバーのサブスクライブは難しいためです。2 番目の方法を使用するとします。Person クラスの変更イベントをサブスクライブします。次に、次のような欠点があります。

  • ビュー モデルのコンストラクターで、リストの各 "Person" メンバーをサブスクライブする必要があります。
  • ビューモデルでは、コレクションが変更されるたびに、そのリストの追加/削除されたメンバーを購読/購読解除する必要があります。
  • ビュー モデルを破棄するときに、サブスクライブされた変更されたイベントのサブスクライブを解除する必要があります。

したがって、Person クラスの変更イベントをサブスクライブする場合、これはオーバーヘッドです。

于 2013-09-13T13:46:32.980 に答える