しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Xamarin.iOS で ViewModel の変更を検知する

前回の投稿 ではスワイプ操作によって ViewRenderer → Xamarin.Forms → ViewModel という方向にデータ変更を伝搬させましたが、逆の場合、いわゆるデータバインディングの変更通知の場合に対応することを考えてみます

Xamarin には残念ながら iOS の Storyboard 上で データバインディングを定義する方法が提供されていません

iOS アプリ自体も MVCアーキテクチャを標準としているためデータバインディングの仕組みはありません

ではどうするか?

f:id:matatabi_ux:20141005111921p:plain

それは 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 を変更すると・・・

f:id:matatabi_ux:20141005122141p:plain

ViewModel から回りまわって ViewRenderer に変更が戻ってきました!