C#集合属性应为只读

C#集合属性应为只读,c#,data-binding,mvvm,collections,C#,Data Binding,Mvvm,Collections,我已在Visual Studio中运行代码分析,并收到以下警告: CA2227:集合属性应为只读 我知道这意味着什么,为什么我不应该有一个公共设置。 但我不知道该怎么处理 在我的ViewModel中,我有以下属性: private ObservableCollection<Foo> _foos = new ObservableCollection<Foo>(); public ObservableCollection<Foo> Foos { get

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

CA2227:集合属性应为只读

我知道这意味着什么,为什么我不应该有一个公共设置。 但我不知道该怎么处理

在我的
ViewModel
中,我有以下属性:

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

public ObservableCollection<Foo> Foos
{
    get { return _foos; }
    set
    {
        _foos = value;
        OnPropertyChanged();
    }
}
我可以这样做:

_foos = BusinessLayer.GetFoos();
OnPropertyChanged("Foos");
或者这个:

var foos = BusinessLayer.GetFoos();
foreach(var foo in foos) 
{
    Foos.Add(foo);
}
哪种方式比较合适?有更好的方法吗?

只要使用

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

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

我同意集合属性应为只读。从类内部实例化集合一次。然后处理它的项目,而不是集合本身。顺便说一句,您的业务层不应该返回可观的集合。这是一个与业务逻辑无关的ViewModel概念。“这段代码会丢失任何更新。”嗯?只要Foos是一个ObservableCollection,任何绑定到它的人都会看到集合更新事件,并且应该做出适当的反应。使用INPC属性公开ObservableCollection是一种代码味道。我的意思是从业务层更新到视图模型-如果有人更改
BusinessLayer.GetFoos()
,您必须自己更新视图模型中的集合。ObservableCollection不支持AddRange@Dani:然后逐个添加它们。他只是说“将从业务层返回的元素添加到集合中。”你可以这样做,对吗?@Will:当然可以,谢谢
var foos = BusinessLayer.GetFoos();
foreach(var foo in foos) 
{
    Foos.Add(foo);
}
Foos.Clear();
Foos.AddRange(BusinessLayer.GetFoos());