2013-02-12 3 views
4

Я пытаюсь решить, хочу ли я переключить все свои коллекции IEnumerable на Observable Collections. Я не могу найти хорошее объяснение этому. Каковы плюсы и минусы наблюдаемой коллекции в понятных терминах?Плюсы и минусы использования Observable Collection over IEnumerable

+0

В качестве второстепенного примечания: Observables реализует IEnumerable. У них просто есть дополнительная выгода, которую они могут настроить, чтобы отслеживать пользовательский интерфейс. – sircodesalot

+3

Закрыто? С уважением, не согласны с этим голосованием.Это полностью входит в рамки «Я хотел бы, чтобы другие объясняли мне _______», как указано в FAQ, и определяет конкретные элементы, для которых ОП запрашивает объяснение. Было несколько хороших, подробных ответов, которые, я думаю, демонстрируют, что «неконструктивное» закрытие неуместно. Голосование для повторного открытия. –

+1

Спасибо @ Давид В. Я немного смутил себя, почему он был закрыт. – JLott

ответ

12

Вы можете выбрать 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>(); 
+1

+1 для показа реализации NotifyPropertyChanged :) –

+0

Хммм это действительно полезно. Я могу немного поработать с ним. Это может решить проблемы, с которыми я столкнулся с IEnumerable. Спасибо! \ – JLott

3

Возможно, я отвечу на ваш вопрос следующим образом: Необходимо ли уведомлять ваше приложение, когда ваши коллекции меняют контент? Если это так, то такое изменение возможно оправдано. Я понимаю, что всеобъемлющая особенность коллекций Observable заключается в том, что они предоставляют механизм уведомлений при изменении коллекции, тогда как IEnumerable предоставляет только одноимеризатор.

Я надеюсь, что это поможет.

1

всей сути наблюдаемой коллекции является то, что они реализуют следующие интерфейсы

INotifyCollectionChanged, INotifyPropertyChanged 

Это делает его очень легко предупредить UI/ViewModel из изменения и обновления соответственно. Если вы не использовали ObservableCollection, вам потребуется вручную выполнить обновление коллекции/свойств.

2

Наибольшее преимущество использования ObservableCollection - это внедрение INotifyCollectionChanged и INotifyPropertyChanged, что упрощает привязку данных. Я бы сказал, что лучше использовать ObservableCollection, когда вы сначала настраиваете привязки данных.

Но теперь, когда вы уже закодировали (и привязали данные?) Кучу IEnumerables, на данный момент нет никакой экономии.

Другим важным моментом является то, что ObservableCollection<T>являетсяIEnumerable (Наследуется от Collection<T>). Поскольку IEnumerable является интерфейсом, он реализуется многими классами List<T> является одним из таких классов - ObservableCollection<T> - это еще один.

+1

Мне нравится пример @Clemens, который показывает в коде различия в отношении привязки данных. Итак, возможно, все ваши будущие дополнения к проекту могут выиграть от 'ObservableCollecion ' – EtherDragon

+0

. Я еще не ограничил их ... У меня возникают проблемы с этим, потому что мне нужно использовать значение из другого представления, а представление I Я не могу видеть эти данные. Я слышал, что изменение его на наблюдаемую коллекцию может исправить, но я все еще не совсем уверен. Вот ссылка на мой предыдущий вопрос, который привел к этому вопросу ... http://stackoverflow.com/questions/14836678/ connect-data-in-two-classes-for-use-in-a-view/14836935 # comment20791174_14836935 – JLott

+0

@JLott Отвечено отредактировано с новой информацией – EtherDragon