thr*_*rag 36 .net c# wpf observablecollection
我想在包含对象列表(来自数据库)的视图模型上公开属性.
我需要这个集合是只读的.也就是说,我想阻止添加/删除等.但是允许foreach和indexers工作.我的目的是声明一个包含可编辑集合的私有字段,并使用只读公共属性引用它.如下
public ObservableCollection<foo> CollectionOfFoo {
get {
return _CollectionOfFoo;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,该语法只会阻止更改对集合的引用.它不会阻止添加/删除等
完成此任务的正确方法是什么?
Eri*_* J. 61
每次访问ReadOnlyFoo时,[先前]接受的答案实际上将返回不同的 ReadOnlyObservableCollection.这很浪费,可能导致细微的错误.
一个好的解决方案是:
public class Source
{
Source()
{
m_collection = new ObservableCollection<int>();
m_collectionReadOnly = new ReadOnlyObservableCollection<int>(m_collection);
}
public ReadOnlyObservableCollection<int> Items
{
get { return m_collectionReadOnly; }
}
readonly ObservableCollection<int> m_collection;
readonly ReadOnlyObservableCollection<int> m_collectionReadOnly;
}
Run Code Online (Sandbox Code Playgroud)
有关完整讨论,请参阅ReadOnlyObservableCollection反模式.
我不喜欢使用,ReadOnlyObservableCollection<T>因为它似乎是一个错误/破碎的课程; 我更喜欢基于合同的方法.
以下是我使用的允许共变的内容:
public interface INotifyCollection<T>
: ICollection<T>,
INotifyCollectionChanged
{}
public interface IReadOnlyNotifyCollection<out T>
: IReadOnlyCollection<T>,
INotifyCollectionChanged
{}
public class NotifyCollection<T>
: ObservableCollection<T>,
INotifyCollection<T>,
IReadOnlyNotifyCollection<T>
{}
public class Program
{
private static void Main(string[] args)
{
var full = new NotifyCollection<string>();
var readOnlyAccess = (IReadOnlyCollection<string>) full;
var readOnlyNotifyOfChange = (IReadOnlyNotifyCollection<string>) full;
//Covarience
var readOnlyListWithChanges =
new List<IReadOnlyNotifyCollection<object>>()
{
new NotifyCollection<object>(),
new NotifyCollection<string>(),
};
}
}
Run Code Online (Sandbox Code Playgroud)