前回の投稿 ではスワイプ操作によって ViewRenderer → Xamarin.Forms → ViewModel という方向にデータ変更を伝搬させましたが、逆の場合、いわゆるデータバインディングの変更通知の場合に対応することを考えてみます
Xamarin には残念ながら iOS の Storyboard 上で データバインディングを定義する方法が提供されていません
iOS アプリ自体も MVC のアーキテクチャを標準としているためデータバインディングの仕組みはありません
ではどうするか?
それは ViewRenderer に用意された OnElementPropertyChanged というメソッドを override する方法です
このメソッドは Element(Xamarin.Forms の View)の BindableProperty の値が変更された場合に呼び出されるため、こちらを利用すれば ViewModel からのデータ変更を検知できるというわけです
とりあえず ViewRenderer に下記の記述を追加します
/// <summary> /// Element プロパティ変更イベントハンドラ /// </summary> /// <param name="sender">イベント発行者</param> /// <param name="e">イベント引数</param> protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); switch (e.PropertyName) { case "Value": case "Maximum": case "Minimum": this.SetNeedsDisplay(); break; } }
この状態でスワイプして this.Element.Value を変更すると・・・
ViewModel から回りまわって ViewRenderer に変更が戻ってきました!