IEnumerable
すべてのコレクションを監視可能なコレクションに切り替えるかどうかを決定しようとしています。これについての良い説明が見つかりません。Observable Collection の長所と短所をわかりやすい言葉で説明すると、次のようになります。
4 に答える
IEnumerable<Something>
一部のプロパティのタイプとして持つことを決定できますがObservableCollection<Something>
、実際の値として使用します。
次のようなプロパティがある場合:
private IEnumerable<Something> collectionOfSomething;
public IEnumerable<Something> CollectionOfSomething
{
get { return collectionOfSomething; }
set
{
collectionOfSomething = value;
NotifyPropertyChanged("CollectionOfSomething");
}
}
これで、次のようにそのプロパティに割り当てることができます
someViewModelObject.CollectionOfSomething = new ObservableCollection<Something>();
コレクション プロパティ (たとえばItemsControl.ItemsSource
) に割り当てまたはバインドすると、ターゲット オブジェクトは通常、実際のプロパティ値が実装されているかどうかINotifyCollectionChanged
(何を実装しているか) を確認し、ハンドラーをObservableCollection
アタッチして、ソース コレクションの変更について通知を受けます。CollectionChanged
後で他のよりスマートな実装をINotifyCollectionChanged
行うことにした場合、すべてのプロパティ タイプを変更する必要はありません。割り当てを次のように置き換えるだけです
someViewModelObject.CollectionOfSomething = new MyVerySmartCollection<Something>();
あなたの質問に対する答えは、おそらく次のようになります。コレクションのコンテンツが変更されたときに、アプリケーションに通知する必要がありますか? もしそうなら、そのような変更はおそらく正当化されます。私の理解では、Observable コレクションの包括的な機能は、コレクションが変更されたときに通知のメカニズムを提供することですが、IEnumerable は単一反復列挙子のみを提供します。
それが役立つことを願っています。
ObservableCollection を使用する最大の利点は、INotifyCollectionChanged と INotifyPropertyChanged が自動的に実装されるため、データ バインドが簡単になることです。最初にデータ バインディングを設定するときは、ObservableCollection を使用することをお勧めします。
しかし、すでに多数の IEnumerable をコード化 (およびデータ バインド) したので、この時点で節約できるものはありません。
考慮すべきもう 1 つのことObservableCollection<T>
は、 IEnumerable
(Inherited from Collection<T>
) です。IEnumerable
はインターフェイスであるため、多くのクラスによって実装されていますが、List<T>
そのようなクラスの 1 つObservableCollection<T>
とは別のクラスです。
Observable コレクションの要点は、次のインターフェースを実装することです。
INotifyCollectionChanged, INotifyPropertyChanged
これにより、UI/ViewModel に変更を通知し、それに応じて更新することが非常に簡単になります。ObservableCollection を使用しなかった場合は、コレクション/プロパティへの更新を自分で手動で実装する必要があります。