2016-07-21 28 views
0

Derzeit habe ich diese generische Implementierung durch Erben von einer vorhandenen Basisklasse, die INotifyPropertyChanged bereitstellt. Ich kann diese Basisklasse nicht ändern, aber ich möchte die Eigenschaftenänderungsbenachrichtigungen auch als Observable bereitstellen, also implementiere ich auch die IReactiveNotifyPropertyChanged Schnittstelle.So implementieren Sie IReactiveNotifyPropertyChanged für eine Basisklasse, die retreat implementiert INotifyPropertyChanged

Ich finde den Code unten (durch einen Prozess von Versuch und Irrtum erhalten), um ziemlich beteiligt zu sein und fragte mich, ob dies in einer einfacheren, prägnanteren Weise getan werden könnte.

Auch ich habe Schwierigkeiten, mit Ideen zu kommen, um Benachrichtigungen zu unterdrücken. Irgendwelche Gedanken?

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; 
    } 
} 

Antwort

0

Sie haben das kürzeste mögliche Stück Code geschrieben, Changed und Changing Observablen zu implementieren, was wollen Sie mehr erreichen? :)

Da Sie benötigen Changed, Changing, SuppressChangeNotifications, und vielleicht in einem Monat Sie etwas anderes von ReactiveObject wollen, wäre die beste Lösung ReactiveObject als Basisklasse zu verwenden sein. Aber wenn Sie das nicht tun kann, werde ich Ihnen vorschlagen, den Quellcode reactiveui und nehmen Sie nur die Teile des Codes zum Download, die Sie benötigen: https://github.com/reactiveui/ReactiveUI

Sie besser nicht implementieren selbst bestimmte Funktionen . Die Ersteller des Frameworks haben sich mit vielen Fehlern und Problemen beschäftigt, so dass ihr Code sicherlich solider ist als das, was ich oder Sie selbst produzieren können (es sei denn, wir sind genial).