wpf stringformat binding




cómo pasar un entero como ConverterParameter? (4)

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


¡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.


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.


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.





ivalueconverter