如何在一个实现INotifyPropertyChanged的基类上实现IReactiveNotifyPropertyChanged

时间:2016-07-21 12:05:47

标签: inotifypropertychanged reactiveui

目前,我通过继承提供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; 
    }
}

1 个答案:

答案 0 :(得分:0)

您已经编写了尽可能短的代码来实现ChangedChanging observables,您想要实现更多目标? :)

由于您需要ChangedChangingSuppressChangeNotifications,并且可能在一个月内您需要ReactiveObject的其他内容,因此最佳解决方案是使用{{ 1}}作为基类。 但是,如果你不能这样做,我建议你下载 reactiveui 的源代码,并只需要你需要的代码片段: https://github.com/reactiveui/ReactiveUI

您最好不要自己实现某些功能。框架的创建者已经处理了许多错误和问题,所以他们的代码肯定比我或你自己可以产生的更加坚实(除非我们是天才)。