Pregunta

Quiero agregar un valor constante a un entero enlazado entrante.De hecho, tengo varios lugares donde quiero vincularme al mismo valor fuente pero agregar constantes diferentes.Entonces la solución ideal sería algo como esto...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=24}"/>

(NOTA:Este es un ejemplo para mostrar la idea, mi escenario de enlace real no es la propiedad lienzo de un cuadro de texto.Pero esto muestra la idea más claramente)

Por el momento, la única solución que se me ocurre es exponer muchas propiedades fuente diferentes, cada una de las cuales agrega una constante diferente al mismo valor interno.Entonces podría hacer algo como esto...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus24}"/>

Pero esto es bastante desalentador porque en el futuro es posible que necesite seguir agregando nuevas propiedades para nuevas constantes.Además, si necesito cambiar el valor agregado, debo modificar el objeto fuente, lo cual es bastante desagradable.

¿Debe haber una forma más genérica que esta?¿Algún experto en WPF tiene alguna idea?

¿Fue útil?

Solución

Creo que puedes hacer esto con un convertidor de valores.Aquí hay un Entrada de blog que aborda el paso de un parámetro al convertidor de valores en el xaml.Y este blog proporciona algunos detalles sobre la implementación de un convertidor de valores.

Otros consejos

Uso un MathConverterque creé para hacer todas las operaciones aritmáticas simples.El código para el convertidor es aquí y se puede utilizar así:

<TextBox Canvas.Top="{Binding SomeValue, 
             Converter={StaticResource MathConverter},
             ConverterParameter=@VALUE+5}" />

Incluso puedes usarlo con operaciones aritmáticas más avanzadas como

Width="{Binding ElementName=RootWindow, Path=ActualWidth,
                Converter={StaticResource MathConverter},
                ConverterParameter=((@VALUE-200)*.3)}"

Usar un convertidor de valores es una buena solución al problema, ya que le permite modificar el valor de origen a medida que se vincula a la interfaz de usuario.

He usado lo siguiente en un par de lugares.

public class AddValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        object result = value;
        int parameterValue;

        if (value != null && targetType == typeof(Int32) && 
            int.TryParse((string)parameter, 
            NumberStyles.Integer, culture, out parameterValue))
        {
            result = (int)value + (int)parameterValue;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Ejemplo

 <Setter Property="Grid.ColumnSpan"
         Value="{Binding 
                   Path=ColumnDefinitions.Count,
                   RelativeSource={RelativeSource AncestorType=Grid},
                   Converter={StaticResource addValueConverter},
                   ConverterParameter=1}"
  />

Nunca he usado WPF, pero tengo una posible solución.

¿Puede su ruta vinculante asignarse a un mapa?Si es así, debería poder aceptar un argumento (la clave).Necesitaría crear una clase que implemente la interfaz del Mapa, pero que en realidad solo devuelva el valor base con el que inicializó el "Mapa" agregado a la clave.

public Integer get( Integer key ) { return baseInt + key; }  // or some such

Sin alguna capacidad para pasar el número de la etiqueta, no veo cómo lograr que devuelva diferentes deltas del valor original.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top