目前,我通过从提供INotifyPropertyChanged
的现有基类继承来实现这个通用实现。我不能更改这个基类,但我想同时作为Observable
提供属性更改通知,所以我也实现了IReactiveNotifyPropertyChanged
接口。
我发现下面的代码(通过反复尝试获得)非常复杂,我想知道是否可以用一种更简单、简洁的方式来完成。
此外,我正在努力想出抑制通知的想法。有什么想法吗?
public class MyReactiveClass<T> : PropertyChangeNotifyingBaseClass<T>, IReactiveNotifyPropertyChanged<T>
where T : class
{
public MyReactiveClass()
{
Changed = Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>
(
t => PropertyChanged += t, // add handler
t => PropertyChanged -= t // remove handler
// conversion from EventPattern to ReactivePropertyChangedEventArgs
).Select(ev => new ReactivePropertyChangedEventArgs<T>(ev.Sender as T, ev.EventArgs.PropertyName));
Changing = Observable.FromEventPattern<System.ComponentModel.PropertyChangingEventHandler, PropertyChangingEventArgs>
(
t => PropertyChanging += t, // add handler
t => PropertyChanging -= t // remove handler
// conversion from EventPattern to ReactivePropertyChangedEventArgs
).Select(ev => new ReactivePropertyChangedEventArgs<T>(ev.Sender as T, ev.EventArgs.PropertyName));
}
public IObservable<IReactivePropertyChangedEventArgs<T>> Changing { get; }
public IObservable<IReactivePropertyChangedEventArgs<T>> Changed { get; }
public IDisposable SuppressChangeNotifications()
{
// how to deal with suppression of change notifications?!
return Disposable.Empty;
}
}
您已经编写了尽可能短的代码来实现Changed
和Changing
可观察性,您还想实现什么?:)
由于您需要Changed
、Changing
、SuppressChangeNotifications
,也许一个月后您会想要ReactiveObject
的其他内容,因此最好的解决方案是使用ReactiveObject
作为基类。但如果你不能做到这一点,我建议你下载reactiveui的源代码,并只获取你需要的代码片段:https://github.com/reactiveui/ReactiveUI
你最好不要自己实现某些功能。该框架的创建者已经处理了许多错误和问题,因此他们的代码肯定比我或你自己制作的更可靠(除非我们是天才)。