常に変化するリストを公開する(外部)モデルがあります(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 が現在選択されている項目を保持していることを確認するにはどうすればよいですか (その項目が削除された場合を除く)