Estoy tratando de vincularme a una propiedad entera:
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter=0}" />
y mi convertidor es:
[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;
}
}
el problema es que cuando se llama a mi convertidor, el parámetro es una cadena. Necesito que sea un número entero. por supuesto que puedo analizar la cadena, pero ¿tengo que hacerlo?
gracias por cualquier ayuda konstantin
wpf
binding
ivalueconverter
Akonsu
fuente
fuente
Respuestas:
¡Aqui tienes!
El truco consiste en incluir el espacio de nombres para los tipos de sistemas básicos y luego escribir al menos el enlace ConverterParameter en forma de elemento.
fuente
IValueConverter.Convert()
's 'parámetro' parámetro esobject
. Todavía tienes que emitirlo / analizarlo ...Para completar, una posible solución más (quizás con menos escritura):
(Por supuesto,
Window
se puede reemplazar porUserControl
yIntZero
se puede definir más cerca del lugar de uso real).fuente
No estoy seguro de por qué la
WPF
gente tiende a no estar dispuesta a consumirMarkupExtension
. Es la solución perfecta para muchos problemas, incluido el mencionado aquí.Si esta extensión de marcado está disponible en el
XAML
espacio de nombres 'm', el ejemplo del póster original se convierte en:Esto funciona porque el analizador de extensiones de marcado puede ver el tipo fuerte del argumento del constructor y convertir en consecuencia, mientras que el argumento ConverterParameter de Binding es (menos informativo) de tipo Objeto.
fuente
Value
un enobject
lugar deint
evitar meterlo en cajas cada vezProvideValue
. (Y luego,private
evite asignar algo ilegal directamente).ProvideValue
lo general, solo se llama una vez por instancia de extensión de marcado, por lo que el encuadre solo debe ocurrir una vez de todos modos. Al no hacerlo en el constructor, evito boxear por completo siProvideValue
nunca se llama. En cuanto a hacerValue
privado, esto excluiría el uso de la extensión de marcado en laXAML
sintaxis del elemento de objeto: msdn.microsoft.com/en-us/library/…Binding.ConverterParameter
no tiene un tipo específico (es solo unobject
), por lo que el analizador no sabe qué conversión aplicar, por lo tanto, cada literal se trata como una cadena.{m:Int32 Value=0}
funcionaría igual de bien.)No lo use
value.Equals
. Utilizar:fuente
value.Equals
?Sería bueno expresar de alguna manera la información de tipo para ConverterValue en XAML, pero no creo que sea posible a partir de ahora. Así que supongo que tienes que analizar el objeto convertidor a tu tipo esperado por alguna lógica personalizada. No veo otra forma.
fuente