我的班级有一个内部可观察的集合。我想通过函数将数据传递给类的用户。
我不希望他们能够更改可观察集合或集合本身内的对象。
明智地使用这种性能和易用性的最佳方法是什么?
答案 0 :(得分:5)
可能使用此:ReadOnlyObservableCollection<T>
。请注意,您必须为对象编写自己的只读包装器,因为ReadOnlyObservableCollection<T>
仅阻止对集合本身的更新。
答案 1 :(得分:2)
我不喜欢使用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 readOnlyNotifyOfChange1 = (IReadOnlyNotifyCollection<string>) full;
//Covarience
var readOnlyListWithChanges = new List<IReadOnlyNotifyCollection<object>>()
{
new NotifyCollection<object>(),
new NotifyCollection<string>(),
};
}
}
答案 2 :(得分:1)
我为这种类型的实现所做的是拥有一个带有底层BindingList的共享类,供整个客户端使用。有一个公共的readonly getter,在实际的UI演示者中我包含了一种Filtered List(绑定到实例化的底层单例),允许客户端视图应用Expression过滤器(LINQ也启用,基于底层T)并且,如果UI控件数据绑定到此筛选列表,则列表更改仅在通过筛选器时才会自动支持UI更新。它只是readonly,因为服务器端正在发布更新到整个WCF控制器类,将它们传递给List层,完全跳过UI。