私は整数プロパティにバインドしようとしています:
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter=0}" />
私のコンバーターは:
[ValueConversion(typeof(int), typeof(bool))]
public class IntToBoolConverter : IValueConverter
{
public object Convert(object value, Type t, object parameter, CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
{
return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
}
}
問題は、コンバーターが呼び出されるとパラメーターが文字列になることです。整数である必要があります。もちろん、文字列を解析できますが、必要ですか?
助けてくれてありがとうコンスタンチン
やった!
<RadioButton Content="None"
xmlns:sys="clr-namespace:System;Assembly=mscorlib">
<RadioButton.IsChecked>
<Binding Path="MyProperty"
Converter="{StaticResource IntToBoolConverter}">
<Binding.ConverterParameter>
<sys:Int32>0</sys:Int32>
</Binding.ConverterParameter>
</Binding>
</RadioButton.IsChecked>
</RadioButton>
トリックは、基本的なシステムタイプのネームスペースを含めてから、少なくともConverterParameterバインディングを要素形式で記述することです。
完全を期すために、もう1つの可能な解決策(おそらくタイピングが少ない):
<Window
xmlns:sys="clr-namespace:System;Assembly=mscorlib" ...>
<Window.Resources>
<sys:Int32 x:Key="IntZero">0</sys:Int32>
</Window.Resources>
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter={StaticResource IntZero}}" />
(もちろん、Window
はUserControl
に置き換えることができ、IntZero
は実際の使用場所の近くで定義できます。)
なぜWPF
の人々がMarkupExtension
を使うことを嫌がる傾向があるのかわかりません。ここに記載されている問題を含む多くの問題に対する完璧なソリューションです。
public sealed class Int32Extension : MarkupExtension
{
public Int32Extension(int value) { this.Value = value; }
public int Value { get; set; }
public override Object ProvideValue(IServiceProvider sp) { return Value; }
};
このマークアップ拡張機能がXAML
名前空間「m」で使用できる場合、元のポスターの例は次のようになります。
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter={m:Int32 0}}" />
これが機能するのは、マークアップ拡張パーサーがコンストラクター引数の強力な型を認識し、それに応じて変換できるのに対し、BindingのConverterParameter引数が(情報の少ない)オブジェクト型であるためです。
value.Equals
を使用しないでください。つかいます:
Convert.ToInt32(value) == Convert.ToInt32(parameter)
XAMLでConverterValueの型情報を何らかの形で表現するのは良いことですが、現時点では可能だとは思いません。そのため、何らかのカスタムロジックを使用して、コンバータオブジェクトを目的のタイプに解析する必要があると思います。別の方法は見当たりません。