Primera; la pregunta es retórica, yo tengo una respuesta! He recibido mucha ayuda por parte de considerar aquí que yo quería dar a este truco de nuevo.

Imagine que tiene un valor que desee enlazar, pero es de alguna manera o algo mal.

  • Tuve una situación en la que yo quería enlazar a un valor, pero cuando el valor fue de 1, necesitaba 0, y viceversa.
  • Hubo un tiempo cuando yo quería obligar a la anchura de un elemento a la anchura de un padre – 68px.
Bonito amplio uso de la idea de un convertidor. Voy a mantener esta idea en mente. La mayor parte de las matemáticas que he necesitado para hacer en valores vinculados pueden hacer uso de un convertidor. Mi experiencia es en llamar a estos, ya sea una transformación lineal de la función o de primer grado del polinomio. Probablemente el nombre de un LinearTransformConverter.
Usted debe publicar la respuesta como una respuesta real en lugar de incluir en la pregunta.
También se le llama «el primer grado de función» en francés… Bueno, en todas partes, supongo 😀
Inteligente, pero en la mayoría de los casos, si usted está usando un convertidor de valores en lugar de vista de la lógica del modelo probablemente estás cometiendo un error de algún tipo. Sin duda hay un montón de excepciones a esta (estoy seguro de que, por ejemplo, que existen creíble casos de uso para no tener un modelo de vista, aunque no he visto uno). Pero mi sensación es que el valor de los convertidores en general son un hack para la inyección de código en XAML, que hace de este un hack para la inyección de código en un hack.

OriginalEl autor Tor Thorbergsen | 2011-02-11

2 Comentarios

  1. 12

    Entrar en el FirstDegreeFunctionConverter:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Data;
    namespace GenericWPF
    {
    ///<summary>
    ///Will return a*value + b
    ///</summary>
    public class FirstDegreeFunctionConverter : IValueConverter
    {
    public double A { get; set; }
    public double B { get; set; }
    #region IValueConverter Members
    public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
    double a = GetDoubleValue( parameter, A );
    double x = GetDoubleValue( value, 0.0 );
    return ( a * x ) + B;
    }
    public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
    double a = GetDoubleValue( parameter, A );
    double y = GetDoubleValue( value, 0.0 );
    return ( y - B ) / a;
    }
    #endregion
    private double GetDoubleValue( object parameter, double defaultValue )
    {
    double a;
    if( parameter != null )
    try
    {
    a = System.Convert.ToDouble( parameter );
    }
    catch
    {
    a = defaultValue;
    }
    else
    a = defaultValue;
    return a;
    }
    }

    ¿Cómo se usa?

    Que hacer un recurso para cada uso en la sección de recursos:

    <GenericWPF:FirstDegreeFunctionConverter x:Key="ReverseOne"
    A="-1"
    B="1" />
    <Border Opacity="{Binding Path=Opacity
    , ElementName=daOtherField
    , Converter={StaticResource ReverseOne}}" />
    <GenericWPF:FirstDegreeFunctionConverter x:Key="ListboxItemWidthToErrorWidth"
    A="1"
    B="-68" />
    <TextBox MaxWidth="{Binding Path=ActualWidth
    , Converter={StaticResource ListboxItemWidthToErrorWidth}
    , RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" />

    El nombre proviene de la función y = a*x + b (Llamado «primer grado de la función» en noruego), y por supuesto, no sería posible actualizar a un segundo grado de la función y= a*x^2 + bx + c, pero no he encontrado un uso para él todavía.

    Tuve una situación en la que yo quería hacer columnas en función de la anchura. Cada vez que tengo 200 píxeles de ancho más, yo quería que el contenedor para mostrarme otra columna. En ese momento me codificados de un convertidor, pero yo debería haber hecho un y=(a/x) + b convertidor de lugar.

    Ahora, ¿qué debería haber nombrado a este convertidor de modo que todo el mundo entiende lo que es? Ya que soy un noruego, he utilizado la expresión que hemos aprendido en la escuela, traducido directamente. Por favor, si usted tiene una sugerencia o una opinión, que me haga saber.
    Alguna mejora o mejoras que ha pensado también sería apreciado…


    Tal vez «LinearTransformConverter» iba a comunicar mejor lo que el convertidor hace por ti, voy a pensar en ello.
    Cualquier otra propuesta?
    Tor

    OriginalEl autor Tor Thorbergsen

  2. 5

    Lo que es aún mejor es un PolynomialConverter, aquí está la versión:

    public class PolynomialConverter : IValueConverter
    {
    public DoubleCollection Coefficients { get; set; }
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
    double x = (double)value;
    double output = 0;
    for (int i = Coefficients.Count - 1; i >= 0 ; i--)
    output += Coefficients[i] * Math.Pow(x, (Coefficients.Count - 1) - i);
    return output;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
    //This one is a bit tricky, if anyone feels like implementing this...
    throw new NotSupportedException();
    }
    }

    Ejemplos:

    <!-- x^2 -->
    <vc:PolynomialConverter Coefficients="1,0,0"/>
    <!-- x + 5 -->
    <vc:PolynomialConverter Coefficients="1,5"/>
    <!-- 2x + 4 -->
    <vc:PolynomialConverter Coefficients="2,4"/>

    Alternativamente, se podría utilizar el ConverterParameter lugar para no establecer los Coeficientes en el propio convertidor.

    DoubleCollection coefficients = DoubleCollection.Parse((string)parameter);
    //...

    OriginalEl autor H.B.

Dejar respuesta

Please enter your comment!
Please enter your name here