ReactiveUI/ViewModelを作る

提供: MonoBook
移動: 案内検索

基本[編集]

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:"");
        }
    }

関連項目[編集]

参考文献[編集]