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接口显式引用您的集合.
您可以投票支持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)
想要在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)
这对我来说效果很好.