wpf - stringformat - cómo pasar un entero como ConverterParameter?
wpf datagrid stringformat (5)
¡Aqui tienes!
<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>
El truco es incluir el espacio de nombres para los tipos de sistema básicos y luego escribir al menos el enlace ConverterParameter en forma de elemento.
Estoy intentando enlazar 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 cadena. Necesito que sea un número entero. por supuesto, puedo analizar la cadena, pero ¿tengo que hacerlo?
gracias por cualquier ayuda konstantin
No estoy seguro de por qué las personas WPF
tienden a ser MarkupExtension
utilizar MarkupExtension
. Es la solución perfecta para muchos problemas, incluido el problema mencionado aquí.
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; }
};
Si esta extensión de marcado está disponible en el espacio de nombres XAML
''m'', entonces el ejemplo del cartel original se convierte en:
<RadioButton Content="None"
IsChecked="{Binding MyProperty,
Converter={StaticResource IntToBoolConverter},
ConverterParameter={m:Int32 0}}" />
Esto funciona porque el analizador de extensión de marcado puede ver el tipo fuerte del argumento constructor y convertir en consecuencia, mientras que el argumento ConverterParameter de Binding es (menos informativo) Object-typed.
No use value.Equals
. Utilizar:
Convert.ToInt32(value) == Convert.ToInt32(parameter)
Para completar, una solución más posible (quizás con menos tipeo):
<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}}" />
(Por supuesto, Window
se puede reemplazar con UserControl
, e IntZero
se puede definir más cerca del lugar de uso real).
Sería bueno expresar de algún modo la información de tipo para el Convertidor 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 mediante alguna lógica personalizada. No veo otra manera.