как передать целое число в качестве ConverterParameter? - PullRequest
85 голосов
/ 20 октября 2010

Я пытаюсь привязать к целочисленному свойству:

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

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

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

Ответы [ 5 ]

95 голосов
/ 02 августа 2011

Вот, пожалуйста!

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

42 голосов
/ 10 ноября 2014

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

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

35 голосов
/ 01 апреля 2015

Не уверен, почему 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's ConverterParameter является (менее информативным) типом объекта.

4 голосов
/ 20 октября 2010

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

  Convert.ToInt32(value) == Convert.ToInt32(parameter)
0 голосов
/ 20 октября 2010

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

...