Как передать целое число как 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, но я не думаю, что это возможно на данный момент. Поэтому, я думаю, вам нужно проанализировать объект конвертера на ваш ожидаемый тип с помощью некоторой пользовательской логики. Я не вижу другого способа.