🥳
INotifyPropertyChangedのイベントをR3で購読したい
dotnet/Reactiveにはカスタムデリゲートを指定可能なファクトリメソッドFromEventPattern
が存在していましたが、R3のFromEventPattern
メソッドには同様のシグネチャがありません。
var obj = new Bindable();// INotifyPropertyChangedを継承したクラス
// dotnet/Reactiveにはこんなファクトリメソッドがある
Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(h => obj.PropertyChanged += h, h => obj.PropertyChanged -= h);
// R3ではEventArgsの型のみ指定可能
Observable.FromEventPattern<PropertyChangedEventArgs>(/*中略*/);
カスタムデリゲートはINotifyPropertyChanged
に限らず、昔から存在する.NETのイベントAPIで見かける存在でありちょっと困ってしまったのですが、よく見てみたらFromEvent
メソッドの方にデリゲートの型変換が可能なものが用意されていることに気づきました。
というわけで以下のような拡張メソッドを用意しておくと便利です。
static class Extensions
{
public static Observable<PropertyChangedEventArgs> ObservePropertyChanged(this INotifyPropertyChanged self, CancellationToken cancellationToken = default)
=> Observable.FromEvent<PropertyChangedEventHandler, PropertyChangedEventArgs>(static h => (s, e) => h(e), h => self.PropertyChanged += h, h => self.PropertyChanged -= h, cancellationToken);
}
var obj = new Bindable();// INotifyPropertyChangedを継承したクラス
// 🥳🥳🥳
obj.ObservePropertyChanged().Subscribe();
Discussion