どの ReactiveProperty のパッケージを使えばいいの?
ReactiveProperty には色々なパッケージで構成されています。以下のように 7 種類もあります。
- ReactiveProperty
- ReactiveProperty.Core
- ReactiveProperty.Blazor
- ReactiveProperty.WPF
- ReactiveProperty.UWP (最近動作確認してません)
- ReactiveProperty.XamariniOS (最近動作確認してません)
- ReactiveProperty.XamarinAndroid (最近動作確認してません)
ここでは、自分のケースではどのパッケージを参照するのがいいのか?という疑問に答えようと思います。
WPF on .NET Framework or .NET 6 の場合
ReactiveProperty.WPF パッケージを参照してください。このパッケージを参照すると以下のパッケージがついてきます。
- ReactiveProperty
- ReactiveProperty.Core
つまり、ReactiveProperty.WPF を参照すれば ReactiveProperty の基本的な機能と WPF 向けに提供されている機能が追加されます。WPF 向けに提供している機能は以下になります。
- 画面のイベントを ReactiveCommand や ReactiveProperty につなぐための部品
- EventToReactiveCommand
- EventToReactiveProperty
- WPF 用の ReactiveProperty 向けのスケジューラー
- ReactivePropertyWpfScheduler
スケジューラーは Getting Start に書いてある方法で必ず設定してください。バリデーション機能の画面への反映がうまくいかない問題が起きるケースがあります。
UWP の場合
EventToReactiveCommand や EventToReactiveProperty が必要な場合は ReactiveProperty.UWP を参照してください。
不要な場合は ReactiveProperty を参照してください。
注意点としては UWP 向けのパッケージ CI/CD パイプラインを組むのがメンドクサイので dotnet build コマンドで UWP のプロジェクトがビルドできるようになるまでは更新予定はありません。そのため少し古いバージョンの ReactiveProperty になります。
ReactiveProperty パッケージ内の機能だけであれば普通に最新版を使えます。
Xamarin.Forms の場合
ReactiveProperty パッケージを使ってください。
Xamarin.Android の場合
Xamarin で Xamarin.Forms を使わずに axml などで UI を組む場合は ReactiveProperty.XamarinAndroid パッケージを使うと UI 部品のイベントを IObservable に変換したりといった細かい機能が使えます。
ただ、あまりメンテナンスしてないので ReactiveProperty パッケージのほうが安全だと思います。
Xamarin.iOS の場合
Xamarin で Xamarin.Forms を使わずに iOS のアプリを組む場合は ReactiveProperty.iOS を使うと UI 部品と ReactiveProperty のバインド機能などが使えます。
使えますが、こちらもあまりメンテナンスしてないので動くかどうか私は自信がありません。過去に壊れてたこともあります。壊れてるのを見つけた人は Pull request ください。
ReactiveProperty パッケージを使うだけなら問題なく出来ます。
Blazor の場合
ReactiveProperty.Blazor を使ってください。EditForm のバリデーション機能と ReactiveProperty<T>
の連携機能があります。
MAUI の場合
ReactiveProperty パッケージを使ってください。MAUI の正式リリース後に ReactiveProperty.MAUI パッケージを作るつもりです。
その他 UI フレームワーク
ReactiveProperty パッケージを使ってください。
Model レイヤーでの使用
ReactiveProperty パッケージを使ってください。ただし ReactiveProperty<T>
や ReadOnlyReactiveProperty<T>
は UI スレッドへのイベントの自動ディスパッチなどを行う機能を持ってるので Model のレイヤーで使うには若干オーバースペックです。
そのためなるべく ReactivePropertySlim<T>
や ReadOnlyReactivePropertySlim<T>
クラスを使うことをお勧めします。
単純な INofityPropertyChanged をラップした Value プロパティを持つクラスとして ReactivePropertySlim<T>
を使いたい場合は ReactiveProperty.Core パッケージを参照してください。これは System.Reactive への参照もない本当に必要最低限の機能がはいっています。Rx 系機能も使いたい場合は ReactiveProperty.Core と System.Reactive を参照すると ReactivePropertySlim<T>
と Rx の機能を利用可能です。
Discussion