使用Observable Collection与使用IEnumerable相比的优缺点

5

我正在考虑是否要将所有的IEnumerable集合转换为Observable Collections。但我找不到一个好的解释。以易懂的方式,有哪些使用Observable Collection的优缺点呢?


作为一个小的侧面说明:Observables 也实现了 IEnumerable 接口。它们有额外的好处,可以设置为被 UI 监视。 - sircodesalot
3
被关闭?尊重不同意那个投票结果。正如FAQ所述,这完全符合“我想让其他人向我解释某事”的范围,并且确定了OP请求解释的具体要素。已经有几个好的、详细的答案,我认为证明了“不具建设性”的关闭是不恰当的。投票重新开放。 - David W
1
谢谢@David W. 我自己也有点困惑为什么它被关闭了.. - JLott
1
@JLott 不客气。不知道它会不会有帮助,但有时候必须尝试 :) - David W
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)分配或绑定值时,目标对象通常会检查实际属性值是否实现了INotifyCollectionChangedObservableCollection的作用),并附加一个CollectionChanged处理程序以便在源集合中发生更改时被通知。
如果您后来决定拥有其他更智能的INotifyCollectionChanged实现,您不需要更改所有属性类型。只需将分配更改为以下内容之类的东西即可。
someViewModelObject.CollectionOfSomething = new MyVerySmartCollection<Something>();

嗯,这真的非常有帮助。我可能会花一些时间来尝试它。它可能解决我一直以来在IEnumerable方面遇到的问题。谢谢! - JLott

3
我会将您的问题答案用以下方式概括:当你的集合内容发生变化时,你的应用程序是否需要得到通知?如果是这样,那么使用Observable collections可能是合理的。据我所知,Observable collections最重要的特征是提供了一种机制来在集合发生变化时发送通知,而IEnumerable仅提供单次迭代枚举器。
希望这能帮到您。

2
使用ObservableCollection最大的好处在于它自动实现了INotifyCollectionChanged和INotifyPropertyChanged,这使得数据绑定更加简单。我建议在第一次设置数据绑定时使用ObservableCollection。
但是,如果您已经编码并且数据已经绑定到了许多IEnumerables,那么此时就没有任何节省的空间了。
另一个需要考虑的问题是,ObservableCollection是IEnumerable的一个实现(从Collection继承而来)。由于IEnumerable是一个接口,因此许多类都实现了它,例如List就是其中之一,ObservableCollection也是其中之一。

1
我喜欢@Clemens的示例,它在代码中展示了数据绑定方面的差异。因此,也许您将来添加到项目中的所有内容都可以从ObservableCollection<T>中受益。 - EtherDragon
我还没有对它们进行绑定... 我遇到了问题,因为我必须使用另一个视图中的值,而我正在工作的视图无法看到该数据。 我听说将其更改为可观察集合可以修复它,但我仍然不是很确定.. 这是我的先前问题的链接,导致了这个问题... http://stackoverflow.com/questions/14836678/connect-data-in-two-classes-for-use-in-a-view/14836935#comment20791174_14836935 - JLott

1
整个可观察集合的意义在于它们实现了以下接口。
 INotifyCollectionChanged, INotifyPropertyChanged 

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接