4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

XamarinAdvent Calendar 2014

Day 7

MvvmCross の Visibility Converter

Posted at

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 型のプロパティを定義してバインディングするのは可能です。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?