Xamarin.Forms ValueConverterにBinding可能なパラメータの追加の仕方

今回は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匹」と表示されます。

タイトルとURLをコピーしました