只读的可观察集合。

5

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

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

从性能和易用性方面来看,最好的方法是什么?

3个回答

5

可能会使用这个: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>(),
            };
    }
}

哇,这是一个很好的方法。谢谢你分享。 - PavelS

1
我针对这种实现方式所做的是创建一个带有共享类的基础 BindingList,供整个客户端使用。其中有一个公共只读 getter,在实际的 UI presenter 中,我包括了一种类型的筛选列表(绑定到底层单例初始化时),它允许客户端视图应用表达式筛选器(基于底层 T 的 LINQ 使其有效),并且通过将 UI 控件数据绑定到此筛选列表,仅当其通过过滤器时,列表更改才会自动支持 UI 更新。而它是只读的,因为服务器端正在发布更新到一个整体 WCF 控制器类,并将其传递到 List 层,跳过了 UI。

欢迎来到Stackoverflow,并祝贺您的第一个答案。请尽量使其易于理解 - 例如通过格式化(代码,分段或列表样式)。也许一个例子会有所帮助? - Mateng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接