我想公开一个视图模型的属性,其中包含一个对象列表(来自数据库)。
我需要这个集合是只读的。也就是说,我想阻止添加/删除等操作,但允许foreach和索引器工作。我的意图是声明一个私有字段,保存可编辑的集合,并使用只读的Public Property引用它。如下所示
public ObservableCollection<foo> CollectionOfFoo {
get {
return _CollectionOfFoo;
}
}
然而,这种语法只是阻止了对集合的引用的改变,并没有阻止添加/删除等操作。
实现这一目标的正确方法是什么?
5条答案
按热度按时间643ylb081#
解决方案是:
参见ReadOnlyObservableCollection anti-pattern以获得完整的讨论。
请注意,每次访问ReadOnlyFoo时,[previously] accepted answer实际上会返回一个不同的ReadOnlyObservableCollection。这是浪费的,可能会导致细微的bug。
guz6ccqo2#
我不喜欢使用
ReadOnlyObservableCollection<T>
,因为它看起来像一个错误/损坏的类;我更喜欢基于合同的方法。以下是我使用的允许协方差的方法:
9cbw7uwe3#
您可以将属性的类型更改为IEnumerable:
我不相信有一个标准的接口来公开索引器。如果你需要它,你可以写一个接口并扩展ObservableCollection来实现它:
ozxc1zmp4#
你也可以覆盖你正在使用的list类,并在其中一个构造函数中放置一个immutable标志,这样如果它是在immutable标志设置为true的情况下构造的,它就不会添加/删除。
2uluyalo5#
使用ReadOnlyObservableCollection< T >
正如已经指出的那样,请使用Eric J的答案,因为这个答案每次都错误地返回一个新示例。