我正在尝试决定是否要将所有IEnumerable
个集合切换到Observable Collections。我找不到对此的好解释。可观察的术语中可观察集合的优缺点是什么?
答案 0 :(得分:13)
您可能决定将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 :(得分:3)
我可能会以这种方式确定您问题的答案:当您的收藏集更改内容时,是否需要通知您的应用程序?如果是这样,那么可能需要进行这样的改变。我的理解是Observable集合的首要特性是它们在集合发生变化时提供通知机制,而IEnumerable只提供单迭代枚举器。
我希望有所帮助。
答案 2 :(得分:2)
使用ObservableCollection的最大好处是它自动实现了INotifyCollectionChanged和INotifyPropertyChanged,这使得数据绑定变得更加简单。我会说在你第一次设置数据绑定时最好使用ObservableCollection。
但是既然你已经编写了(和数据绑定的?)一堆IEnumerables,那么现在还没有任何节省。
要考虑的另一件事是ObservableCollection<T>
是 IEnumerable
(继承自Collection<T>
)。由于IEnumerable
是一个接口,因此它由许多类实现List<T>
就是这样一个类 - ObservableCollection<T>
是另一个类。
答案 3 :(得分:1)
Observable集合的全部意义在于它们实现了以下接口
INotifyCollectionChanged, INotifyPropertyChanged
这样可以非常轻松地提醒UI / ViewModel更改并相应地进行更新。如果您没有使用ObservableCollection,则需要手动自己实现对集合/属性的更新。