【发布时间】:2013-03-18 18:17:33
【问题描述】:
我的班级有一个内部可观察的集合。我想通过函数将 this 中的数据传递给该类的用户。
我不希望他们能够更改可观察集合内的对象或集合本身。
实现这一性能和易用性的最佳方法是什么?
【问题讨论】:
标签: .net encapsulation observablecollection
我的班级有一个内部可观察的集合。我想通过函数将 this 中的数据传递给该类的用户。
我不希望他们能够更改可观察集合内的对象或集合本身。
实现这一性能和易用性的最佳方法是什么?
【问题讨论】:
标签: .net encapsulation observablecollection
可能使用这个:ReadOnlyObservableCollection<T>。请注意,您必须为您的对象编写自己的只读包装器,因为 ReadOnlyObservableCollection<T> 只会阻止对集合本身的更新。
【讨论】:
我不喜欢使用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>(),
};
}
}
【讨论】:
我为这种类型的实现所做的是拥有一个具有底层 BindingList 的共享类,供整个客户端使用。有一个公共的只读 getter,在实际的 UI 演示器中,我包含了一种过滤列表(在实例化时绑定到底层单例),它允许客户端视图应用表达式过滤器(LINQ 也启用,基于底层 T)并且,通过将 UI 控件数据绑定到此过滤列表,列表更改仅在通过过滤器时才会自动支持 UI 更新。而且它是只读的,因为服务器端将更新发布到整个 WCF 控制器类,然后将它们向下传递到 List 层,完全跳过 UI。
【讨论】: