Как передать целое число как ConverterParameter?

Я пытаюсь связать свойство integer:

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

проблема заключается в том, что когда мой конвертер называется параметром, это строка. Мне нужно, чтобы оно было целым числом. конечно, я могу разобрать строку, но мне нужно?

спасибо за любую помощь константин

Ответ 1

Здесь ya go!

<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 в виде элемента.

Ответ 2

Для полноты еще одно возможное решение (возможно, с меньшим набором символов):

<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 можно определить ближе к месту фактического использования.)

Ответ 3

Не уверен, почему 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 namespace 'm', тогда исходный пример плаката будет выглядеть следующим образом:

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter={m:Int32 0}}" />

Это работает, потому что парсер разметки расширений может видеть сильный тип аргумента конструктора и преобразовывать его соответствующим образом, тогда как аргумент Binding ConverterParameter (менее информативно) задан на предмет.

Ответ 4

Не используйте value.Equals. Использование:

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

Ответ 5

Было бы хорошо как-то выразить информацию типа для ConverterValue в XAML, но я не думаю, что это возможно на данный момент. Поэтому, я думаю, вам нужно проанализировать объект конвертера на ваш ожидаемый тип с помощью некоторой пользовательской логики. Я не вижу другого способа.