Я пытаюсь выполнить привязку к целочисленному свойству:
<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;
}
}
проблема в том, что когда мой конвертер вызывается, параметром является строка. мне нужно, чтобы это было целое число. Конечно, я могу разобрать строку, но нужно ли?
спасибо за любую помощь Константин
wpf
binding
ivalueconverter
аконсу
источник
источник
Ответы:
Вот так!
Уловка состоит в том, чтобы включить пространство имен для основных типов системы, а затем записать хотя бы привязку ConverterParameter в форме элемента.
источник
IValueConverter.Convert()
«S „параметр“ параметра естьobject
. Вам все еще нужно разыграть / проанализировать его ...Для полноты картины еще одно возможное решение (возможно, с меньшим набором текста):
(Конечно,
Window
можно заменить наUserControl
, иIntZero
можно определить ближе к месту фактического использования.)источник
Не знаю, почему
WPF
люди не склонны к употреблениюMarkupExtension
. Это идеальное решение для многих проблем, включая проблему, упомянутую здесь.Если это расширение разметки доступно в
XAML
пространстве имен 'm', тогда исходный пример плаката станет:Это работает, потому что синтаксический анализатор расширения разметки может видеть строгий тип аргумента конструктора и соответствующим образом преобразовывать, тогда как аргумент Binding ConverterParameter (менее информативно) типизирован для объекта.
источник
Value
object
int
ProvideValue
private
ProvideValue
вызывается только один раз для каждого экземпляра расширения разметки, поэтому упаковка в любом случае должна выполняться только один раз. Не делая этого в конструкторе, я вообще избегаю бокса, еслиProvideValue
он никогда не вызывается. Что касаетсяValue
приватности, это не позволит использовать расширение разметки вXAML
синтаксисе объектного элемента: msdn.microsoft.com/en-us/library/…Binding.ConverterParameter
него нет определенного типа (это простоobject
), поэтому синтаксический анализатор не знает, какое преобразование применить, поэтому каждый литерал обрабатывается просто как строка.{m:Int32 Value=0}
тоже работал бы.)Не используйте
value.Equals
. Использование:источник
value.Equals
?Было бы неплохо как-то выразить информацию о типе ConverterValue в XAML, но я не думаю, что на данный момент это возможно. Итак, я предполагаю, что вам нужно проанализировать объект Converter для ожидаемого типа с помощью некоторой настраиваемой логики. Другого пути не вижу.
источник