只读可观察的集合

时间:2010-05-19 18:20:22

标签: .net encapsulation observablecollection

我的班级有一个内部可观察的集合。我想通过函数将数据传递给类的用户。

我不希望他们能够更改可观察集合或集合本身内的对象。

明智地使用这种性能和易用性的最佳方法是什么?

3 个答案:

答案 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。