可观察到的 FromEventPattern INotifyCollectionChanged 错误
Observable FromEventPattern INotifyCollectionChanged Bug
我一直在想办法做到这一点。当我有一个自定义控件时,我试图观察控件 ItemsSource 中的集合更改。我想使用 Reactive Extensions,这样我就可以轻松处理事件监视并避免复杂的弱事件模式。当我的 ItemsSource 设置为 ListCollectionView(来自 xaml 中的 CollectionViewSource)或 ReadOnlyObservableCollection 时,FromEventPattern 会抛出错误:
“无法在 'System.Windows.Data.ListCollectionView' 类型的对象上找到事件 'CollectionChanged'。”
这些 类 通过显式实现 INotifyCollectionChanged 来隐藏 INotifyCollectionChanged。
这是我的代码。这是 Reactive Extensions 中的错误还是我做错了?
IDisposable WatchCollection(INotifyCollectionChanged inc)
{
return Observable.FromEventPattern<INotifyCollectionChanged, NotifyCollectionChangedEventArgs>(inc, "CollectionChanged").Subscribe(ep =>
{
ItemsChanged();
Refresh();
});
}
我认为问题是here。
正确的实现应该是:
private static IObservable<EventPattern<TSender, TEventArgs>> FromEventPattern_<TSender, TEventArgs>(object target, string eventName, IScheduler scheduler)
{
return FromEventPattern_<TSender, TEventArgs, EventPattern<TSender, TEventArgs>>(typeof(TSender), target, eventName, (sender, args) => new EventPattern<TSender, TEventArgs>(sender, args), scheduler);
}
归档issue 1239.
同时,您可以将其更改为:
return Observable
.FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
e => inc.CollectionChanged += e,
e => inc.CollectionChanged -= e)
.Subscribe(ep =>
{
ItemsChanged();
Refresh();
});
我一直在想办法做到这一点。当我有一个自定义控件时,我试图观察控件 ItemsSource 中的集合更改。我想使用 Reactive Extensions,这样我就可以轻松处理事件监视并避免复杂的弱事件模式。当我的 ItemsSource 设置为 ListCollectionView(来自 xaml 中的 CollectionViewSource)或 ReadOnlyObservableCollection 时,FromEventPattern 会抛出错误: “无法在 'System.Windows.Data.ListCollectionView' 类型的对象上找到事件 'CollectionChanged'。” 这些 类 通过显式实现 INotifyCollectionChanged 来隐藏 INotifyCollectionChanged。 这是我的代码。这是 Reactive Extensions 中的错误还是我做错了?
IDisposable WatchCollection(INotifyCollectionChanged inc)
{
return Observable.FromEventPattern<INotifyCollectionChanged, NotifyCollectionChangedEventArgs>(inc, "CollectionChanged").Subscribe(ep =>
{
ItemsChanged();
Refresh();
});
}
我认为问题是here。
正确的实现应该是:
private static IObservable<EventPattern<TSender, TEventArgs>> FromEventPattern_<TSender, TEventArgs>(object target, string eventName, IScheduler scheduler)
{
return FromEventPattern_<TSender, TEventArgs, EventPattern<TSender, TEventArgs>>(typeof(TSender), target, eventName, (sender, args) => new EventPattern<TSender, TEventArgs>(sender, args), scheduler);
}
归档issue 1239.
同时,您可以将其更改为:
return Observable
.FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
e => inc.CollectionChanged += e,
e => inc.CollectionChanged -= e)
.Subscribe(ep =>
{
ItemsChanged();
Refresh();
});