2010-05-19 152 views
5

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

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

什么是最好的方式来做这种性能和易用性明智?

回答

5

可能使用此:ReadOnlyObservableCollection<T>。请注意,由于ReadOnlyObservableCollection<T>只能阻止对集合本身的更新,因此您必须为自己的对象编写自己的只读封装器。

1

我对这种类型的实现做了什么,是为了让整个客户端使用一个带有底层BindingList的共享类。有一个公共readonly getter,并且在实际的UI展示器中,我包含了一种过滤列表(绑定到实例化的底层单例),这将允许客户端视图应用表达式过滤器(基于底层T,也启用LINQ)并且,通过UI将数据绑定到此过滤列表,列表更改只有在它通过过滤器时才会自动支持UI更新。它只是只读的,因为服务器端发布更新到整个WCF控制器类,并将它们传递给List层,完全跳过UI。

+0

欢迎和#1恭喜您的第一个答案。请尽量让它更易于理解 - 例如通过格式化(代码,单独的段落或列表样式)。也许一个例子会有所帮助? – Mateng 2012-11-14 23:02:51

1

我不喜欢使用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>(), 
      }; 
    } 
}