Inténtelo: Convertir datos de un tipo a otro
Un convertidor de valores ofrece un método adecuado para convertir datos de un tipo a otro. Cuando enlace un valor de propiedad de un objeto en Blend para Visual Studio a un valor de datos u otro valor de propiedad, los tipos de valor deben coincidir. Por ejemplo, quizá desee convertir una cadena de un cuadro de texto como "123" en su correspondiente valor entero para una barra deslizante o convertir una propiedad como Visibility.Hidden en un valor booleano como false.
Un 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 Interfaz IValueConverter en MSDN.
Para aplicar un convertidor de valores, rellene el campo Convertidor de valores del cuadro de diálogo Crear enlace de datos cuando enlace datos a una propiedad.
Crear una clase de convertidor de valores
Este procedimiento proporciona un ejemplo de una clase .NET, escrita en C#, que se puede agregar sólo a un proyecto que ya usa C# para sus archivos de código subyacente. No obstante, hay más de una forma de agregar código a un proyecto. Como alternativa, use Microsoft Visual Studio para compilar la clase en un archivo .dll y agregue una referencia a ese archivo .dll en el proyecto.
Para obtener más información, vea Agregar o quitar una referencia en Blend.
Para crear una clase de convertidor de valores
Haga clic con el botón secundario en el panel Proyectos y elija Agregar nuevo elemento.
En el cuadro de diálogo Nuevo elemento, haga clic en Class, escriba DoubleValueConverter.cs en el campo Nombre y haga clic en Aceptar.
Se crea un nuevo archivo de código con el lenguaje que esté usando la solución. Para el propósito de este procedimiento, el lenguaje es C#. El archivo se agrega al proyecto y se abre en la mesa de trabajo.
En el archivo DoubleValueConverter.cs, elimine la siguiente definición de clase:
public class DoubleValueConverter { public DoubleValueConverter() { // Insert code required on object creation below this point. } }
Reemplace el código eliminado por el siguiente código, que contiene las dos clases de convertidor 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.
/// <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> /// DoubleToRomanNumeralValueConverter 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; } }
Compile (Ctrl+Mayús+B) la solución para ver si tiene errores.
Sugerencia
El proceso de generación compila los archivos de código y hace que las clases estén disponibles para Blend (por ejemplo, en el cuadro de diálogo Crear enlace de datos).Si agrega clases nuevas al archivo de código, deberá recompilar la solución para que estén disponibles para Blend.
Aplicar un convertidor de valores a una propiedad
En el siguiente procedimiento, los convertidores de valores del procedimiento anterior se aplican al valor de un objeto Slider cuando el valor está enlazado a dos objetos TextBox. El resultado es que los cuadros de texto muestran las representaciones de entero y número romano del valor Slider.
Para aplicar un convertidor de valores a una propiedad
En el panel Herramientas, haga clic con el botón secundario en el grupo de herramientas de la parte inferior y seleccione el control Slider en la lista que aparece.
Dibuje un control Slider en la mesa de trabajo del documento principal.
Con el nuevo objeto Slider seleccionado, busque las siguientes propiedades en Propiedades comunes en el panel Propiedades y establezca los valores como se indica a continuación:
Establezca LargeChange en 10. Se trata del cambio incremental que se produce al hacer clic en la barra deslizante.
Establezca Maximum en 2001. El intervalo de valores del control deslizante será de 0 a 2001.
Establezca SmallChange en 1. Se trata del cambio incremental que se produce al usar las teclas de dirección para mover el control deslizante.
En el panel Herramientas, haga clic con el botón secundario en el penúltimo grupo de herramientas y, a continuación, seleccione el control TextBox en la lista que aparece.
Dibuje dos controles TextBox en la mesa de trabajo junto al objeto Slider.
Con el primer objeto de cuadro de texto seleccionado, busque la propiedad Text en Propiedades comunes en el panel Propiedades. Enlazará la propiedad Text al valor del control deslizante.
Haga clic en Opciones avanzadas y elija Enlace de datos en la lista que aparece.
En el cuadro de diálogo Crear enlace de datos, haga clic en la ficha Propiedad del elemento. Aquí es donde se enlazan valores internos a propiedades.
Expanda el árbol de elementos bajo Elementos de la escena y seleccione el objeto [Slider].
En Propiedades, seleccione Value : (Double).
De este modo, se enlazará el contenido del cuadro de texto al valor del control deslizante.
Haga clic en Mostrar propiedades avanzadas y, junto a Convertidor de valores, haga clic en Agregar nuevo convertidor de valores .
En el cuadro de diálogo Agregar convertidor de valores, seleccione DoubleToIntegerValueConverter y haga clic en Aceptar.
Sugerencia
Si no aparece el convertidor de valores, asegúrese de que el archivo de código fuente que creó en el procedimiento anterior, DoubleValueConverter.cs, se ha agregado al proyecto y que ha compilado el proyecto (Ctrl+Mayús+B).
En el cuadro de diálogo Crear enlace de datos, haga clic en Aceptar.
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.Blend crea un nombre de forma automática.
Repita los pasos 6 a 13 con el segundo objeto TextBox, pero esta vez seleccione DoubleToRomanNumeralValueConverter en el cuadro de diálogo Agregar convertidor de valores.
Ejecute el proyecto (F5). Mueva el control Slider para ver los valores actualizados en los dos objetos Label.
Sin usar el convertidor de valores, un cuadro de texto que muestre el valor de un control deslizante mostraría muchos decimales.
Vea también
Tareas
Enlazar un objeto con datos proporcionados por el usuario o con otros valores internos