【问题标题】:MVVM - Should I expose ReadOnlyObservableCollection, ReadOnlyCollection, ICollection, etc?MVVM - 我应该公开 ReadOnlyObservableCollection、ReadOnlyCollection、ICollection 等吗?
【发布时间】:2011-10-16 00:49:23
【问题描述】:

基本上,我一直认为您应该尽可能返回公开的基类型,并担心内部的实现细节,这是有道理的...

但是,我不确定在这里做什么。基本上,现在我有:

ReadOnlyObservableCollection<Foo> MyFoos {get; private set; }

我想知道是否应该将其作为ReadOnlyCollection&lt;Foo&gt;ICollection&lt;Foo&gt; 返回,因为在内部我从未真正使用任何可观察的部分或尝试写入集合。 WPF 似乎不在乎我返回什么,它仍然绑定它并正确触发集合更改通知事件。但是,我在某处读到,我应该将其设计为真正让任何消费视图处理我的 ViewModel。

所以我在这里有点伤心。我认为将其保留为ReadOnlyObservableCollection&lt;T&gt; 最有意义的是明确告诉消费视图他们可以和不可以对该属性做什么,但我也认为您应该将类​​型减少到他们的基础尽可能输入。所以我不确定在这里做什么。尤其是 WPF 不关心我返回什么类型这一事实,它发现它是可观察的。

【问题讨论】:

  • 根据 Jeffrey Richter 的说法,为了给调用者提供最大的灵活性,你的参数应该尽可能的基础(例如,当你所做的只是枚举列表时,使用 IEnumerable 而不是 List)并且您的返回应该尽可能具体(即,当您返回 List 时,调用者可以将其视为 List、IList、ICollection、IEnumerable 等)
  • 哦,所以它的参数尽可能少,返回尽可能具体。
  • 是的,这是我尝试遵循的一个不错的经验法则。

标签: c# wpf mvvm observablecollection readonly-collection


【解决方案1】:

我可能会将其保留为ReadOnlyObservableCollection,因为它非常明确地说明了您的 ViewModel 的消费者可以对您的集合执行什么操作。另请注意,WPF 实际上并不直接绑定到您的集合,它绑定到CollectionViewSource.GetDefaultView 的返回值,它返回一个ICollectionViewICollectionView 在其合约中有 INotifyCollectionChanged

【讨论】:

    【解决方案2】:

    performance perspective,您至少希望将项目源用作实现INotifyCollectionChanged 的集合。 MVVM 提供了很多好处,但主要关注单元测试和关注点分离,因此选择使用ReadOnlyObservableCollection 还是ICollection{T} 之类的接口将取决于您的单元测试目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2011-05-15
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      相关资源
      最近更新 更多