これはより一般的な形で回答されているかもしれませんが、ここではより具体的なケースがあり、これをどのように解決すべきかを知りたいと思います。私はWPFアプリケーションを作成し、MVVMパターンを使用しようとしています(初めてこのパターンを使用します)。WPFリストとObservableCollections
私のドメインオブジェクトであるViperにはいくつかのプロパティとコレクションがあり、既存のいくつかのアプリケーションで使用されています。私は新しいWPFアプリケーションでバインドしたいすべてのプロパティにINotifyPropertyChanged
を実装しました。私は今、ドメインオブジェクトとWPFビューの間に座るためのビューモデルを作成しています。問題は、ViperオブジェクトのコレクションであるすべてのプロパティがObservableCollectionsではないリストであることです。 ObservableCollectionsを作ることはできません。これは、このオブジェクトモデルを使用する他のすべてのアプリケーションに影響します(AddRange
などをサポートしていません)。
この新しいWPFアプリケーションは、(ビューモデルを介して)GUIを制御するために使用されるViperオブジェクトのリストを保持します。物事を少し複雑にするために、アプリはList<Viper>
データの形式でデータを受け取ります。アプリはこのViperオブジェクトのリストをループし、入ってくるViperデータを既存のViperにマージします(インデックス別)。これはObservableCollection
ではないので、入ってくるViperオブジェクトが既存のViper(List<Event>
)のEventsプロパティに項目を追加すると言うと、GUIはイベントのグリッドを更新しません。ビューモデルでList<Event>
をOC<Event>
に変換しても、それはビューモデルではないので、ビューモデルではなくすべてのプロパティとコレクションのこのマージを行う基盤となるViperオブジェクトです。 Viperオブジェクトとすべてのサブオブジェクトは、受信データのマージ方法を決定するカスタムMergeWith()
関数を実装しています。いくつかは、置き換えを実行し、いくつかは追加し、いくつかの更新を行います。
この状況を処理する適切な方法は何ですか?不明な点があれば教えてください。
ええと、Viperオブジェクトが更新されるたびに新しいObservableCollectionを作成すると、新しいエンティティであるため、GUIを再バインドする必要がありますか?その時点で、リストをGUIにバインドし、更新するたびにリバインドすることができます。 ObservableCollectionExアプローチでリストを置き換えると、通知を必要としないViperオブジェクトを使用しているプロジェクトでもパフォーマンスが低下することはありませんか? – mdutra
@mdutra実際の 'Viper'オブジェクトが新しいオブジェクトに変わるときはいつでも、新しい' ObservableCollection'(または 'CollectionViewSource')を作成したいと思います。しかし、既存のオブジェクトを更新するだけであれば、手動で'PropertyChanged'イベントです。 – Rachel
@mdutra 'ObservableCollectionEx'に関する2番目の質問では、必要以上に' PropertyChanged'通知を上げることにパフォーマンス上の問題がありますが、それはメソッドの記述方法によって異なります。例えば、 'AddRange'は各項目を一度に1つずつ追加し、追加された項目ごとに変更通知を出したり、それらを一度に追加したり、単一の変更通知を出すことができます – Rachel