より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

ReactiveProperty、ストレスなくWPF開発が出来る

職場でツールを開発することになり、一時限りのツールになりそうなので、使ったことのない技術を思い切って使ってみようということでReactivePropertyを使ってみることにしました。

blog.okazuki.jp

WPF経験があるとはいえ、Prismは使ったことがあってもReactivePropertyは使ったことがありませんでした。

使った感想としては、ストレスなくWPF開発を進めることが出来たという点でした。

どうしても、リアクティブプログラミングが目に行きがちですし、そのための機構ですが、副産物としてはBindingプロパティが過剰にならずに済むということです。

単純にnew ReactiveProperty()でBindingプロパティを宣言できます。

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するのは慣れですが。

blog.okazuki.jp

後始末のための機構を用意しているのもいいですね。

WPFを使うのであれば、積極的に使っていきたいです。

2.9.0以下であれば、.NET Framework4.0で使用が可能です。最新版は使えませんが。

qiita.com