【问题标题】:Pros and Cons of using Observable Collection over IEnumerable在 IEnumerable 上使用 Observable Collection 的优缺点
【发布时间】:2013-01-28 01:42:41
【问题描述】:

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

【问题讨论】:

  • 作为一个小注解:Observables 也实现了 IEnumerable。它们只是有一个额外的好处,即它们也可以设置为由 UI 监控。
  • 关门了?恭敬地不同意该投票。如常见问题解答中所述,这完全在“我希望其他人向我解释_______”的范围内,并确定了 OP 要求解释的特定元素。有几个很好的详细答案,我认为这些答案表明“非建设性”的关闭是不合适的。投票重新开放。
  • 谢谢@David W。我自己对为什么关闭它有点困惑..
  • @JLott 不客气。不知道是否有帮助,但有时必须尝试:)

标签: c# wpf collections ienumerable observablecollection


【解决方案1】:

您可以决定将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 时遇到的问题。谢谢!\
【解决方案2】:

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

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

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

【讨论】:

  • 我喜欢@Clemens 示例,它在代码中显示了数据绑定方面的差异。因此,也许您未来对项目的所有添加都可以从ObservableCollecion&lt;T&gt; 中受益
  • 我还没有限制它们......我遇到了问题,因为我必须使用另一个视图中的值,而我正在使用的视图看不到该数据。我听说将其更改为可观察的集合可以修复它,但我仍然不完全确定.. 这是我之前的问题的链接,它导致了这个问题......stackoverflow.com/questions/14836678/…
【解决方案3】:

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

 INotifyCollectionChanged, INotifyPropertyChanged 

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

【讨论】:

    【解决方案4】:

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多