为什么ReadOnlyObservableCollection.CollectionChanged不公开?

Osk*_*kar 80 .net c# collections

为什么ReadOnlyObservableCollection.CollectionChanged受到保护而不是公开(如相应ObservableCollection.CollectionChanged的那样)?

INotifyCollectionChanged如果我无法访问该CollectionChanged事件,那么实现集合的用途是什么?

Nic*_*ick 56

这是解决方案:ReadOnlyObservableCollection上的CollectionChanged事件

你必须收集到INotifyCollectionChanged.


Res*_*uta 15

我找到了一种方法让你知道如何做到这一点:

ObservableCollection<string> obsCollection = new ObservableCollection<string>();
INotifyCollectionChanged collection = new ReadOnlyObservableCollection<string>(obsCollection);
collection.CollectionChanged += new NotifyCollectionChangedEventHandler(collection_CollectionChanged);
Run Code Online (Sandbox Code Playgroud)

您只需要通过INotifyCollectionChanged接口显式引用您的集合.

  • 我不明白这里有什么困难.ReadOnlyObservableCollection是一个提供观察集合的READ-ONLY方法的类.如果我的班级有会话的集合,并且我不希望人们能够从我的集合中添加或删除会话,但仍然观察它们,那么ReadOnlyObservableCollection就是完美的工具.该集合只读给我班级的用户,但我有一个读/写副本供我自己使用. (14认同)
  • 请注意,ReadOnlyObservableCollection是一个ObservableCollection的包装器 - 它将会改变.ReadOnlyObservableCollection的使用者只允许观察这些更改,而不是自己更改任何内容. (13认同)
  • +1铸造解决方案.但至于观察一个只读集合是不合逻辑的:如果你只读取对数据库的访问,你会期望它永远不会改变吗? (4认同)

jbe*_*jbe 5

您可以投票支持Microsoft Connect上描述此问题的错误条目:https://connect.microsoft.com/VisualStudio/feedback/details/641395/readonlyobservablecollection-t-collectionchanged-event-should-be-public

更新:

Connect门户已被Microsoft关闭.所以上面的链接不再起作用了.

我的Win应用程序框架(WAF)库提供了一个解决方案:ReadOnlyObservableList类:

public class ReadOnlyObservableList<T> 
        : ReadOnlyObservableCollection<T>, IReadOnlyObservableList<T>
{
    public ReadOnlyObservableList(ObservableCollection<T> list)
        : base(list)
    {
    }

    public new event NotifyCollectionChangedEventHandler CollectionChanged
    {
        add { base.CollectionChanged += value; }
        remove { base.CollectionChanged -= value; }
    }

    public new event PropertyChangedEventHandler PropertyChanged
    {
        add { base.PropertyChanged += value; }
        remove { base.PropertyChanged -= value; }
    }
}
Run Code Online (Sandbox Code Playgroud)


por*_*cus 5

想要在ReadOnlyObservableCollection上订阅集合更改的通知,肯定有充分的理由.因此,作为仅将您的集合转换为INotifyCollectionChanged的替代方法,如果您碰巧是子类化ReadOnlyObservableCollection,那么以下提供了一种更方法上访问CollectionChanged事件的方法:

    public class ReadOnlyObservableCollectionWithCollectionChangeNotifications<T> : ReadOnlyObservableCollection<T>
{
    public ReadOnlyObservableCollectionWithCollectionChangeNotifications(ObservableCollection<T> list)
        : base(list)
    {
    }

    event System.Collections.Specialized.NotifyCollectionChangedEventHandler CollectionChanged2
    {
        add { CollectionChanged += value; }
        remove { CollectionChanged -= value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说效果很好.


小智 5

我知道这篇文章很老,但是,在评论之前,人们应该花时间了解.NET中使用的模式.只读集合是现有集合的包装器,它阻止消费者直接修改它,查看ReadOnlyCollection并且您将看到它是一个IList<T>可能是也可能不可变的包装器.不可变集合是一个不同的问题,并由新的不可变集合库涵盖

换句话说,只读是不可变的!

除此之外,ReadOnlyObservableCollection应该暗中实施INotifyCollectionChanged.