5

我正在尝试决定是否要将所有IEnumerable收藏都切换到 Observable Collections。我找不到一个很好的解释。用可理解的术语来说,Observable Collection 的优点和缺点是什么?

4

4 回答 4

14

您可能决定将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>();
于 2013-02-12T17:09:55.843 回答
3

我可能会这样回答您的问题:当您的收藏更改内容时,是否需要通知您的应用程序?如果是这样,那么这样的改变可能是有道理的。我的理解是 Observable 集合的首要特征是它们提供了一种在集合更改时通知的机制,而 IEnumerable 仅提供单迭代枚举器。

我希望这会有所帮助。

于 2013-02-12T17:09:34.350 回答
2

使用 ObservableCollection 的最大好处是它自动实现了 INotifyCollectionChanged 和 INotifyPropertyChanged,这使得数据绑定更简单。我会说最好在第一次设置数据绑定时使用 ObservableCollection。

但是,既然您已经编写了(和数据绑定的?)一堆 IEnumerables,那么此时没有任何节省。

要考虑的另一件事ObservableCollection<T> IEnumerable(继承自Collection<T>)。由于IEnumerable是一个接口,它由许多类实现List<T>是一个这样的类 -ObservableCollection<T>是另一个。

于 2013-02-12T17:10:45.873 回答
1

Observable 集合的全部意义在于它们实现了以下接口

 INotifyCollectionChanged, INotifyPropertyChanged 

这使得提醒 UI/ViewModel 更改和相应更新变得非常容易。如果您没有使用 ObservableCollection,您将需要自己手动实现对集合/属性的更新。

于 2013-02-12T17:10:44.563 回答