wpf stringformat - cómo pasar un entero como ConverterParameter?




binding textbox (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 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).


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.


Algunos ejemplos:

Esta es la versión original, sin envolver:

Esto es NoWrap .

Esto es Wrap . Las palabras Remove y Sample se han ajustado en el ve y el le , respectivamente, aunque no haya oportunidad de salto de línea.

Esto es WrapWithOverflow . El ve y el le no son visibles (desbordan el ancho de bloque disponible) porque no hay oportunidad de salto de línea. El All , en ambos casos, se ha envuelto porque el carácter de space es una oportunidad de salto de línea.

Editar:

Como se sugiere en los comentarios, aquí hay algunos ejemplos de cómo Wrap trata los espacios. Cuando Width es 100 , Wrap y WrapWithOverflow son idénticos. Wrap trata el espacio entre el wider y el example como una oportunidad de salto de línea, por lo que el example se coloca en una nueva línea para preservar la palabra completa y continua.





wpf binding ivalueconverter