ReactiveUI/ViewModelを作る

提供: MonoBook
< ReactiveUI
2015年3月9日 (月) 10:39時点における153.220.119.198 (トーク)による版 (ページの作成:「==基本== ReactiveUIのビューモデルはReactiveObjectクラスを基底クラスとする。 そしてプロパティセッターにおいてReactive...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

基本

ReactiveUIのビューモデルはReactiveObjectクラスを基底クラスとする。 そしてプロパティセッターにおいてReactiveObjectクラスのRaiseAndSetIfChangedメソッドを噛ますことで値の変化を検出通知している。

    using System;
    using ReactiveUI;

    public class MainViewModel : ReactiveObject
    {
        public string Name {
            get { return _name; }
            set { this.RaiseAndSetIfChanged(ref _name, value); }
        }
        private string _name;
    }

WhenAny

WhenAnyメソッドを使うと引数に指定した複数のプロパティのうち、どれかひとつでも変化した場合の処理を書けるようだ。

    using System;
    using ReactiveUI;

    public class MainViewModel : ReactiveObject
    {
        public string FirstName {
            get { return _firstName; }
            set { this.RaiseAndSetIfChanged(ref _firstName, value); }
        }
        private string _firstName;

        public string LastName {
            get { return _lastName; }
            set { this.RaiseAndSetIfChanged(ref _lastName, value); }
        }
        private string _lastName;

        /// <summary>
        /// フルネームは読取専用にしておく
        /// </summary>
        /// <value>The full name.</value>
        public string FullName{
            get { return _fullName.Value; }
        }
        readonly ObservableAsPropertyHelper<string> _fullName;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public MainViewModel()
        {
            this.FirstName = "mono";
            this.LastName  = "book";

            _fullName = this
                .WhenAny(
                    // FirstNameか、LastNameに変化があったら、
                    x => x.FirstName, x => x.LastName,

                    // 結合した文字列を作り
                    (f, l) => string.Format("{0} {1}", f.Value, l.Value))

                // FullNameにぶち込む
                //   Xamarin.MacのNSTextFieldなどの一部のビューではnullを許容していない関係で、
                //   initialValueに空文字を設定しておかないとバインドの際に落ちる。すごく嵌った。
                .ToProperty(this, x => x.FullName, initialValue:"");
        }
    }

関連項目

参考文献