代码之家  ›  专栏  ›  技术社区  ›  Xander

只读可观察集合

  •  5
  • Xander  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 12 年前
        1
  •  5
  •   Stephen Cleary    15 年前

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

        2
  •  2
  •   Meirion Hughes    12 年前

    我不喜欢用 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
  •  1
  •   Walter Woden    14 年前

    对于这种类型的实现,我所做的是让一个共享类与一个底层的bindingList,供整个客户端使用。有一个公共的只读getter,在实际的用户界面展示器中,我包含了一种过滤列表(在实例化时绑定到底层的singleton),它允许客户端视图应用表达式过滤器(也启用了linq,基于底层的t),并且,通过将用户界面控件数据绑定到此过滤列表,列表更改将自动仅当通过过滤器时才支持UI更新。它是只读的,因为服务器端正在将更新发布到一个整体的WCF控制器类,该类将更新传递到列表层,完全跳过UI。