職場でツールを開発することになり、一時限りのツールになりそうなので、使ったことのない技術を思い切って使ってみようということでReactivePropertyを使ってみることにしました。
WPF経験があるとはいえ、Prismは使ったことがあってもReactivePropertyは使ったことがありませんでした。
使った感想としては、ストレスなくWPF開発を進めることが出来たという点でした。
どうしても、リアクティブプログラミングが目に行きがちですし、そのための機構ですが、副産物としてはBindingプロパティが過剰にならずに済むということです。
単純にnew ReactiveProperty
Bindingプロパティは、下記のように宣言されることが多いと思います。
private int _name; public int Name { get { return _name; } set { SetProperty(ref _name, value); } }
スニペットで手順を簡略化出来るとはいえ、可読性がよいとは言い難いです。
公私共にWinFormsばかり使う私は、普通のプロパティを宣言して、なぜ変更が反映されない!?とハマりますので。
また、SetPropertyメソッド自体も宣言しないとなりませんし、手間です。
これが下記で済みます。
public ReactiveProperty<string> Name { get; private set; } = new ReactiveProperty<string>();
Bindingする際には、{Binding Name}ではなく、{Binding Name.Value}とValueプロパティをメンバとして渡す手間があるとはいえ、メンバーの宣言がやはり長くなってしまいますし、それが短くなるのはいいなと思いました。
値のチェック処理も書きやすいです。
Attributeで値の必須チェックなどをやってもいいですが、この手のチェックって複雑で、あれこれ手を入れたくなるものです。
/// <inheritdoc /> public MainWindowViewModel(Window owner) { ProjectFilePath = new ReactiveProperty<string>(); ProjectFilePathValidation = ProjectFilePath.Select(path => ValidateProjectFilePath(path).Item2).ToReactiveProperty(); } private Tuple<bool,string> ValidateProjectFilePath(string path) { if (string.IsNullOrWhiteSpace(path)) { return new Tuple<bool, string>(false, "プロジェクトファイル名を指定してください。"); } if (!File.Exists(path)) { return new Tuple<bool, string>(false, "指定されたファイルが見つかりません。"); } return new Tuple<bool, string>(true, string.Empty); }
ProjectFilePathって一つしかないのにlinqでSelectするのは慣れですが。
後始末のための機構を用意しているのもいいですね。
WPFを使うのであれば、積極的に使っていきたいです。
2.9.0以下であれば、.NET Framework4.0で使用が可能です。最新版は使えませんが。