BETA

ReactivePropertyを用いたViewModelとModelの双方向バインド

投稿日:2019-04-19
最終更新:2019-04-19

ViewModelとModelがReactiveProperty同士かつ、Modelのメンバがプリミティブ型の場合の双方向バインディングの記述例

使用ケースとしては、例えばViewにCheckBoxをもち、そのIsCheckedプロパティをViewModelのReactivePropertyとバインドし、さらにそれをModelのReactivePropertyにも反映したい場合がある(あった)。

Model

    public class Model : INotifyPropertyChanged, IDisposable  
    {  
        private readonly CompositeDisposable _disposable = new CompositeDisposable();  

        public ReactivePropertySlim<bool> CheckState;  

        public Model()  
        {  
            CheckState = new ReactivePropertySlim<bool>(false).AddTo(_disposable);  
        }  

        public event PropertyChangedEventHandler PropertyChanged;  

        public void Dispose()  
        {  
            _disposable?.Dispose();  
        }  
    }  

ViewModel

    public class MainWindowViewModel : BindableBase  
    {  
        private readonly CompositeDisposable _disposable = new CompositeDisposable();  

        private readonly Model _model;  

        public ReactiveProperty<bool> IsChecked;  

        public MainWindowViewModel(Model model)  
        {  
            _model = model;  
            // ToReactivePropertyAsSynchronizedの引数(parameterSelector)で.Valueをつけるだけ  
            IsChecked = _model.CheckState.ToReactivePropertyAsSynchronized(state => state.Value).AddTo(_disposable);  
        }  
    }  

要点としては、ToReactivePropertyAsSynchronizedの引数parameterSelectorで、ラムダの引数に.Valueをつければよいということ。

IsChecked = _model.CheckState.ToReactivePropertyAsSynchronized(state => state.Value).AddTo(_disposable);

注意

このやり方がベストかはわからない、ただ動く。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@katylttoの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!