Inténtelo: Crear y aplicar un convertidor de valores

Esta página es específica de WPF y Silverlight 2

Un convertidor de valores ofrece un método adecuado para convertir datos de un tipo a otro. Cuando se enlazan las propiedades de objetos en Microsoft Expression Blend a valores de datos o a otras propiedades, los tipos de datos deben coincidir. Por ejemplo, es posible que desee convertir un cuadro de texto como "123" a su valor entero correspondiente para una barra de desplazamiento o un campo como Visibility.Hidden a un valor booleano como false.

El convertidor de valores implementa la interfaz IValueConverter en el código de una clase de Microsoft .NET Framework. Deben implementarse tanto el método Convert como el método ConvertBack, porque el motor de enlace de datos llama a estos métodos cuando mueve un valor del origen al destino del enlace. Para obtener más información, vea el artículo sobre IValueConverter (Interfaz) en MSDN.

Para aplicar un convertidor de valores, sólo tiene que rellenar el campo Convertidor de valores del cuadro de diálogo Crearenlace de datos cuando enlace datos a una propiedad.

[!NOTA]

El segundo procedimiento de este tema aplica el convertidor de valores usando un enlace de elemento a elemento, que no se admite en Silverlight 2. No obstante, puede aplicar convertidores de valores a operaciones de enlace a datos que usen un origen de datos CLR.

Para crear una clase de convertidor de valores

  • Pegue el siguiente código en un archivo denominado DoubleValueConverter.cs. Este código contiene los dos convertidores de valores siguientes:

    • DoubleToIntegerValueConverter proporciona una conversión bidireccional entre un valor doble y un entero.

    • DoubleToRomanNumeralValueConverter proporciona una conversión unidireccional de un valor doble a una representación de cadena de un número romano.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Data;
    
    namespace Microsoft.Expression.Samples
    {
        /// <summary>
        /// DoubleToIntegerValueConverter provides a two-way conversion between
        /// a double value and an integer.
        /// </summary>
        public class DoubleToIntegerValueConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter,
                  System.Globalization.CultureInfo culture)
            {
                return System.Convert.ToInt32(value);
            }
    
            public object ConvertBack(object value, Type targetType,
                object parameter, System.Globalization.CultureInfo culture)
            {
                return System.Convert.ToDouble(value);
            }
    
        }
    
        /// <summary>
        /// DoubleToIntegerValueConverter provides a one-way conversion from
        /// a double value to a string representation of a Roman numeral.
        /// </summary>
        public class DoubleToRomanNumeralValueConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter,
                System.Globalization.CultureInfo culture)
            {
                return this.ConvertToRomanNumeral(System.Convert.ToInt32(value));
            }
    
            public object ConvertBack(object value, Type targetType,
                object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
    
            private List<IntegerStringPair> romanStrings = null;
    
            private string ConvertToRomanNumeral(int input)
            {
                StringBuilder myBuilder = new StringBuilder();
    
                foreach (IntegerStringPair thisPair in this.PairSet)
                {
                    while (input >= thisPair.Value)
                    {
                        myBuilder.Append(thisPair.StringValue);
                        input -= thisPair.Value;
                    }
                }
    
                return myBuilder.ToString();
            }
    
            private List<IntegerStringPair> PairSet
            {
                get
                {
                    if (this.romanStrings == null)
                    {
                        this.romanStrings = new List<IntegerStringPair>();
                        this.romanStrings.Add(new IntegerStringPair(1000, "M"));
                        this.romanStrings.Add(new IntegerStringPair(900, "CM"));
                        this.romanStrings.Add(new IntegerStringPair(500, "D"));
                        this.romanStrings.Add(new IntegerStringPair(400, "CD"));
                        this.romanStrings.Add(new IntegerStringPair(100, "C"));
                        this.romanStrings.Add(new IntegerStringPair(90, "XC"));
                        this.romanStrings.Add(new IntegerStringPair(50, "L"));
                        this.romanStrings.Add(new IntegerStringPair(40, "XL"));
                        this.romanStrings.Add(new IntegerStringPair(10, "X"));
                        this.romanStrings.Add(new IntegerStringPair(9, "IX"));
                        this.romanStrings.Add(new IntegerStringPair(5, "V"));
                        this.romanStrings.Add(new IntegerStringPair(4, "IV"));
                        this.romanStrings.Add(new IntegerStringPair(1, "I"));
                    }
    
                    return this.romanStrings;
                }
            }
        }
    
        /// <summary>
        /// IntegerStringPair provides an easy way to store integer and string pairs.
        /// </summary>
        public class IntegerStringPair
        {
            private int value;
            private string stringValue;
            public int Value
            {
                get
                {
                    return this.value;
                }
            }
            public string StringValue
            {
                get
                {
                    return this.stringValue;
                }
            }
            public IntegerStringPair(int value, string stringValue)
            {
                this.value = value;
                this.stringValue = stringValue;
            }
        }
    }
    

Cc295312.7e183f1f-37d8-4dcb-980c-19a5d61ca087(es-es,Expression.10).gifVolver al principio

Para aplicar un convertidor de valores a una propiedad

En el siguiente procedimiento, los convertidores de valores del código anterior se aplican al valor de un objeto Slider cuando el valor está enlazado a dos objetos Label. El resultado es que las etiquetas muestran las representaciones de entero y número romano del valor Slider.

  1. Agregue el archivo DoubleValueConverter.cs al proyecto de Expression Blend. En el menú Proyecto, haga clic en Agregarelementoexistente, busque el archivo DoubleValueConverter.cs y haga clic en Abrir.

    [!NOTA]

    Asegúrese de que el proyecto se creó con la opción de Lenguaje Visual C#. También puede generar el archivo DoubleValueConverter.cs como un archivo .dll y agregar una referencia a este archivo .dll en el proyecto.

  2. Genere el proyecto (Ctrl+Mayús+B) para hacer que las clases de convertidor de valores estén disponibles en el proyecto.

  3. Desde el Cuadro de herramientas, agregue dos controles Label y un control Slider a la mesa de trabajo. Colóquelos de forma que dispongan de suficiente espacio.

  4. Con el objeto Slider seleccionado en Objetos y escala de tiempo, establezca las siguientes propiedades en Propiedadescomunes del panel Propiedades:

    • Establezca LargeChange (cambio grande) en 10. Se trata del cambio incremental que se produce al hacer clic en el control Slider.

    • Establezca Maximum (máximo) en 2001. El intervalo de valores de Slider será de 0 a 2001.

    • Establezca SmallChange (cambio pequeño) en 1. Se trata del cambio incremental que se produce al usar las teclas de dirección para mover el control Slider.

  5. Con el primer objeto Label seleccionado en Objetosyescala de tiempo, haga clic en la propiedad Content (contenido) de Propiedades comunes en el panel Propiedades. Haga clic en Enlace de datos en la lista desplegable que se muestra. Se abrirá el cuadro de diálogo Crearenlace de datos.

  6. En la ficha Propiedad del elemento, seleccione Slider en el árbol de elementos de Elementosde la escena.

  7. En la ficha Propiedad delelemento, seleccione Todas las propiedades en la lista desplegable Mostrar y elija Value : (Double) en Propiedades. De este modo, se enlazará el contenido de la etiqueta al valor de Slider.

  8. Haga clic en el botón Expandir Cc295312.81e110f1-4068-4299-957d-0693cea95088(es-es,Expression.10).png en el cuadro de diálogo Crearenlacede datos para ver la configuración avanzada.

  9. Al lado del cuadro desplegable Convertidorde valores, haga clic en el botón Agregarnuevoconvertidorde valores. Se abrirá el cuadro de diálogo Agregarconvertidorde valores.

  10. Expanda el nombre del proyecto y el espacio de nombres Microsoft.Expression.Samples, seleccione DoubleToIntegerValueConverter y haga clic en Aceptar.

    Cc295312.alert_tip(es-es,Expression.10).gifSugerencia:

    Si no ve el convertidor de valores, asegúrese de que ha agregado el archivo de origen al proyecto y de que ha generado el proyecto (Ctrl+Mayús+B).

  11. En el cuadro de diálogo Crear enlace de datos, haga clic en Finalizar. El primer objeto Label mostrará ahora una representación de entero de Slider.

    [!NOTA]

    Observe que al objeto Slider se le ha asignado el nombre Slider. Los objetos de la aplicación deben tener un nombre para poder hacer referencia a ellos desde cualquier lugar de la aplicación, por ejemplo, durante el enlace de datos. Expression Blend les asigna un nombre de forma automática.

  12. Repita los pasos 5 a 11 con el segundo objeto Label, pero seleccione DoubleToRomanNumeralValueConverter en el cuadro de diálogo Agregar convertidor de valores.

  13. Pruebe el proyecto (F5). Mueva el control Slider para ver los valores actualizados en los dos objetos Label.

Cc295312.7e183f1f-37d8-4dcb-980c-19a5d61ca087(es-es,Expression.10).gifVolver al principio