web-dev-qa-db-ja.com

ConverterParameterとして整数を渡す方法は?

私は整数プロパティにバインドしようとしています:

<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;
    }
}

問題は、コンバーターが呼び出されるとパラメーターが文字列になることです。整数である必要があります。もちろん、文字列を解析できますが、必要ですか?

助けてくれてありがとうコンスタンチン

86
akonsu

やった!

<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バインディングを要素形式で記述することです。

96
jpierson

完全を期すために、もう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}}" />

(もちろん、WindowUserControlに置き換えることができ、IntZeroは実際の使用場所の近くで定義できます。)

43
Vlad

なぜ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引数が(情報の少ない)オブジェクト型であるためです。

35
Glenn Slayden

value.Equalsを使用しないでください。つかいます:

  Convert.ToInt32(value) == Convert.ToInt32(parameter)
4
Aliostad

XAMLでConverterValueの型情報を何らかの形で表現するのは良いことですが、現時点では可能だとは思いません。そのため、何らかのカスタムロジックを使用して、コンバータオブジェクトを目的のタイプに解析する必要があると思います。別の方法は見当たりません。

0
SKG