今回はXamarin.FormsでValueConverterにBinding可能なパラメータの追加をしたいと思います。
そもそもValueConverterを使うと
<ContentPage.Resources>
<ResourceDictionary>
<local:CountConverter x:Key="countConverter" />
</ResourceDictionary>
</ContentPage.Resources>
~
~
<Label Text="{Binding Count, Converter={StaticResource countConverter}, ConverterParameter=1 />
~
~
このような形でConverterParameterを使い、パラメータを渡すことができます。
しかしこのConverterParameterはBindablePropertyではないのでBindして値を渡すことができないのです。
じゃあBindしたい時どうすればいいのかというと、
ValueConverterにBindablePropertyを作ってしまいましょう。
using System;
using System.Globalization;
using Xamarin.Forms;
using Xamarin.Forms.Internals;
namespace TestPrj {
public class AnimalCountConverter : BindableObject, IValueConverter {
public static BindableProperty IsDogProperty = BindableProperty.Create("IsDog", typeof(bool), typeof(AnimalCountConverter));
public bool IsDog {
get => (bool)GetValue(IsDogProperty);
set => SetValue(IsDogProperty, value);
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
var count = (int)value;
if (IsDog)
return "犬" + count + "匹";
return "その他動物" + count + "匹";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}
}
そしてxamlはこのように書きます
<ContentPage
xmlns:local="clr-namespace:TestPrj"
~
~
<Label>
<Label.Text>
<Binding Path="Count">
<Binding.Converter>
<local:CountConverter IsDog="{Binding DogFlag}"/>
</Binding.Converter>
</Binding>
</Label.Text>
</Label>
~
~
これでViewModelでこのように書かれていれば
public class HogeViewModel {
public int Count {get;set;}
public bool DogFlag {get;set;}
public HogeViewModel(){
Count = 3;
DogFlag = true;
}
}
viewのLabelは「犬3匹」と表示されます。