🥳

INotifyPropertyChangedのイベントをR3で購読したい

2024/02/27に公開

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