11

常に変化するリストを公開する(外部)モデルがあります(2秒ごとに言ってみましょう)。ViewModel は、そのリストが PropertyChange イベントに登録されていることを認識しています。その ViewModel は、データ バインディング用の UI に ObservableCollection も提供します。

+-----------------------------------------------+
|                                           View|
| +-----------+                                 |
| |Listbox    |                                 |
| +-----------+                                 |
+-----/\----------------------------------------+
      ||
      ||DataBinding
      ||
      ||
+-----||----------------------------------------+
|     ||                               ViewModel|
| +--------------------+         +-------------+|
| |ObservableCollection|<--------|ChangeHandler||
| +--------------------+    /    +-------------+|
|                          /           ^        |
+-------------------------/------------|--------+
                         /             |
                        /              |
           Synchronizing Lists         | PropertyChanged
                                       |
                                       |
+--------------------------------------|--------+
|                                  +-----+ Model|
|                                  |IList|      |
|                                  +-----+      |
|                                               |
+-----------------------------------------------+

原則として、定期的に行われる更新に加えて、これはうまく機能します。更新のたびに、ユーザーの選択が失われます。つまり、すべての項目が更新のたびに選択解除されます。WPF の ListBox は、新しいリストが割り当てられたことを「認識する」ため、これは当然のことです。

したがって、新しい ObservableCollection を割り当てるのではなく、現在の ObservableCollection のコンテンツを更新された Model.List とマージする必要があります。

今私の質問

  • リストの同期 - そのようなマージを行う方法に関するベスト プラクティス (またはフレームワーク) はありますか (新しいアイテムを ObservableCollection にコピーする、不足しているアイテムを削除する、変更されたアイテムを更新する)
  • 選択された項目 - ListBox が現在選択されている項目を保持していることを確認するにはどうすればよいですか (その項目が削除された場合を除く)
4

1 に答える 1

3

更新されたモデル リストから新しい ObservableCollection を生成するか、現在の ObservableCollection をモデルのものと同期することができます。

2 番目の場合、避けたいことの 1 つは、同期されたすべてのアイテムに対して CollectionChanged イベントを発生させることです。通知を延期する能力を持つこの ObservableCollection 実装を見てください。

現在の SelectedItem を保持することに関しては、ObservableCollection のインスタンスが変更されておらず (コレクションを同期しているため、これは本当です)、SelectedItem インスタンスが削除されていない場合、リストボックスは選択を保持する必要があります。ただし、NotifyCollectionChangedEventArgs.Action が「リセット」の場合、それが正しいかどうかはわかりません。その場合は、ViewModel に collection プロパティと SelectedItem プロパティの両方を持つという、私が使用するアプローチを使用できます。ViewModel の SelectedItem を TwoWay モードで ListBox.SelectedItem にバインドします。コレクションを同期するときは、SelectedItem を一時変数に保存し、削除されていない場合は、同期後に再適用します。

于 2013-02-26T15:55:37.343 に答える