【问题标题】:Read only observable collection只读可观察集合
【发布时间】:2013-03-18 18:17:33
【问题描述】:

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

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

实现这一性能和易用性的最佳方法是什么?

【问题讨论】:

    标签: .net encapsulation observablecollection


    【解决方案1】:

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

    【讨论】:

      【解决方案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>(),
                  };
          }
      }
      

      【讨论】:

      • 哇,多么好的方法。谢谢分享。
      【解决方案3】:

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

      【讨论】:

      • 欢迎来到 Stackoverflow 并祝贺您的​​第一个答案。请尽量让它更容易理解 - 例如通过格式化(代码、单独的段落或列表样式)。也许举个例子会有所帮助?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多