【问题标题】:C# Collection properties should be read only [duplicate]C#集合属性应该是只读的[重复]
【发布时间】:2014-02-03 17:25:55
【问题描述】:

我在 Visual Studio 中运行代码分析并收到以下警告:

CA2227:集合属性应该是只读的。

我知道这意味着什么,以及为什么我不应该有一个公共集。 但我不知道如何处理它。

在我的ViewModel 我有这个属性:

private ObservableCollection<Foo> _foos = new ObservableCollection<Foo>();

public ObservableCollection<Foo> Foos
{
    get { return _foos; }
    set
    {
        _foos = value;
        OnPropertyChanged();
    }
}

此属性绑定到视图。

如何填充这个集合的逻辑在业务层。有一个函数返回一个

ObservableCollection<Foo>

如果 Foos 没有二传手,我就不能这样做。

Foos = BusinessLayer.GetFoos();

我可以这样做:

_foos = BusinessLayer.GetFoos();
OnPropertyChanged("Foos");

或者这个:

var foos = BusinessLayer.GetFoos();
foreach(var foo in foos) 
{
    Foos.Add(foo);
}

哪种方式合适?有更好的方法吗?

【问题讨论】:

  • 我同意 Collection 属性应该是只读的。从您的类内部实例化一次集合。然后处理它的项目,而不是集合本身。
  • 顺便说一句,您的业务层不应返回 ObservableCollections。这是一个与业务逻辑无关的 ViewModel 概念。

标签: c# data-binding mvvm collections


【解决方案1】:

随便用

Foos.Clear();
Foos.AddRange(BusinessLayer.GetFoos());

但是,此代码会丢失任何更新。

【讨论】:

  • "此代码丢失任何更新。"嗯?只要 Foos 是一个 ObservableCollection,任何绑定到它的人都会看到集合更新事件并且应该做出适当的反应。使用 INPC 属性公开 ObservableCollection 是一种代码异味。
  • 我的意思是从业务层更新到视图模型 - 如果有人更改BusinessLayer.GetFoos(),您必须自己更新视图模型中的集合。
  • ObservableCollection 不支持 AddRange
  • @Dani:然后一一添加。他只是说“将业务层返回的元素添加到集合中”。你可以做到,对吧?
  • @Will:当然可以,谢谢
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2012-02-19
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多