MvvmCross の Visibility Converter

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Value Converters

Xamarin + MvvmCross の話をします。

View と ViewModel とのバインディングを行う際に重要なのが Value Converters です。Converter を適切に導入することで、バインディングをすっきりさせることができます。

例えば、文字列を受け取って文字列の長さに変換する StringLength Value Converter を定義しておいて、次のようにバインディングする、といったことが可能です。

set.Bind(lengthLabel).To(vm => vm.HogeText).WithConversion("StringLength");

Visibility Converter

便利な Converter のひとつとして、Visibility Converter を紹介します。これは、MvvmCross プラグインのひとつ Visibility Plugin で提供されており、NuGet でインストールできます。

これは、ViewModel の値に応じて View のパーツの表示・非表示を切り替えたい場合に便利な Converter です。

具体例

iOS の場合を例に挙げます。ViewModel の string 型プロパティ HogeText が空文字列の場合に hogeButton を表示しないようにするには、以下のようにします。

set.Bind(hogeButton).For("Visibility").To(vm => vm.HogeText).WithConversion("Visibility");

どのような仕組みになっているか分解します。

  • For("Visibility") は、Visibility Plugin が提供している UIView へのバインディングです。
    • MvxVisibility.Visible を受け取った場合は UIViewHidden プロパティが false になります。
    • MvxVisibility.Collapsed を受け取った場合は UIViewHidden プロパティが true になります。
  • WithConversion("Visibility") は、各種のデータを MvxVisibility に変換します。
    • bool の値の場合は、trueVisible に、falseCollapsed に変換します。
    • int の値の場合は、0 より大きな値を Visible に変換します。
    • string の値の場合は、null でも空文字列でもなければ Visible に変換します。
    • その他オブジェクトの場合は、null でなければ Visible に変換します。

注意点

For("Visibility")WithConversion("Visibility")(または WithConversion("InvertedVisibility"))とはセットで使わなくてはいけません。

例えば、For(v => v.Hidden)WithConversion("Visibility") とではバインディングできません。Converter が返す MvxVisibilitybool 値ではなく、Hidden プロパティに代入できないためです。

なお、厳密にはセットでなくても、自分で MvxVisibility 型のプロパティを定義してバインディングするのは可能です。

この投稿は Xamarin Advent Calendar 20147日目の記事です。