目前,我通过继承提供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;
}
}
答案 0 :(得分:0)
您已经编写了尽可能短的代码来实现Changed
和Changing
observables,您想要实现更多目标? :)
由于您需要Changed
,Changing
,SuppressChangeNotifications
,并且可能在一个月内您需要ReactiveObject
的其他内容,因此最佳解决方案是使用{{ 1}}作为基类。
但是,如果你不能这样做,我建议你下载 reactiveui 的源代码,并只需要你需要的代码片段:
https://github.com/reactiveui/ReactiveUI
您最好不要自己实现某些功能。框架的创建者已经处理了许多错误和问题,所以他们的代码肯定比我或你自己可以产生的更加坚实(除非我们是天才)。