我正在尝试决定是否要将所有IEnumerable
收藏都切换到 Observable Collections。我找不到一个很好的解释。用可理解的术语来说,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。
但是,既然您已经编写了(和数据绑定的?)一堆 IEnumerables,那么此时没有任何节省。
要考虑的另一件事ObservableCollection<T>
是 IEnumerable
(继承自Collection<T>
)。由于IEnumerable
是一个接口,它由许多类实现List<T>
是一个这样的类 -ObservableCollection<T>
是另一个。
Observable 集合的全部意义在于它们实现了以下接口
INotifyCollectionChanged, INotifyPropertyChanged
这使得提醒 UI/ViewModel 更改和相应更新变得非常容易。如果您没有使用 ObservableCollection,您将需要自己手动实现对集合/属性的更新。