PG.Lib

アプリ開発関連とかガジェット関連とか

Xamarin Forms で MVVM な Data Binding を使う

今回は MVVM な データバインディングを使ってみたいと思います。

Xamarinの公式リファレンスを参考にしました。

Part 5. From Data Bindings to MVVM - Xamarin

XAML

<Grid Grid.Column="5" Grid.ColumnSpan="2" Grid.Row="1"
      Style="{StaticResource baseGrid}">
    <Label
       Text="{Binding DateValue, StringFormat='今は {0:HH:mm:ss}'}" FontSize="Large">
    </Label>
</Grid>

前回の内容から、データバインドする内容を時刻に変えました。

モデル

private DateTime dateValue;
public DateTime DateValue
{
    set
    {
        if (dateValue != value)
        {
            dateValue = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("DateValue"));
            }
        }
    }
    get
    {
        return dateValue;
    }
}

前回のものから dateValue の内容を、MVVMに対応したプロパティに実装を変更しました。

クラス名の部分も以下のように変更します。

public class SampleDat : INotifyPropertyChanged

using の追加も必要ですね。

using System.ComponentModel;


データの変更をわかりやすくするために、モデルのコンストラクタへタイマーを実装して時間を更新していきます。

public SampleDat()
{
    Device.StartTimer(TimeSpan.FromSeconds(1), () =>
     {
         DateValue = DateTime.Now;
         return true;
     });
}

Device.StartTimer を使うためにはusingの追加も必要です。

using Xamarin.Forms;

実行結果

f:id:fxxk_authority:20170501162633p:plain

これで1秒ごとに時間が更新されるようになりました。

値の変更が通知され、バインド先のラベルが連鎖的に更新されていきます。

このあたりは、ほぼUWPと同じですね。