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
を受け取った場合はUIView
のHidden
プロパティがfalse
になります。 -
MvxVisibility.Collapsed
を受け取った場合はUIView
のHidden
プロパティがtrue
になります。
-
-
WithConversion("Visibility")
は、各種のデータをMvxVisibility
に変換します。-
bool
の値の場合は、true
をVisible
に、false
をCollapsed
に変換します。 -
int
の値の場合は、0 より大きな値をVisible
に変換します。 -
string
の値の場合は、null
でも空文字列でもなければVisible
に変換します。 - その他オブジェクトの場合は、
null
でなければVisible
に変換します。
-
注意点
For("Visibility")
と WithConversion("Visibility")
(または WithConversion("InvertedVisibility")
)とはセットで使わなくてはいけません。
例えば、For(v => v.Hidden)
と WithConversion("Visibility")
とではバインディングできません。Converter が返す MvxVisibility
は bool
値ではなく、Hidden
プロパティに代入できないためです。
なお、厳密にはセットでなくても、自分で MvxVisibility 型のプロパティを定義してバインディングするのは可能です。