C#集合属性应为只读
我已在Visual Studio中运行代码分析,并收到以下警告: CA2227:集合属性应为只读 我知道这意味着什么,为什么我不应该有一个公共设置。 但我不知道该怎么处理 在我的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
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());