Ir al contenido principal

[Silverlight] ComboBox con datos de un enumerado

Hola a todos.

Hoy vamos a ver como hacer un binding en un ComboBox con los valores de un enumerado.
La idea es que usamos el combo con valores de texto, pero después tenemos que convertir al enumerado correspondiente.

Primero vamos a crear una función para convertir el enumerado en un array de elementos Enum.


public Enum[] EnumToArray(Enum enumeration)

    //get the enumeration type

    Type et = enumeration.GetType();
    //get the public static fields (members of the enum)

    System.Reflection.FieldInfo[] fi = et.GetFields(BindingFlags.Static | BindingFlags.Public);
    //create a new enum array

    Enum[] values = new Enum[fi.Length];
    //populate with the values

    for (int iEnum = 0; iEnum < fi.Length; iEnum++)
    {

        values[iEnum] = (Enum)fi[iEnum].GetValue(enumeration);
    }

    //return the array

    return values;
}


Luego vamos a crear un enumerado sencillo... Type1, Type2 y Type3 que es el que vamos a utilizar para rellenar el combo box.
Para ello vamos a crear una función en MainPage.xaml.cs invocando a esta función y usando un bucle foreach rellenamos el combo Box.


private void PopulateListBox()
{
      Enum2ListViewViewModel viewModel = DataContext as Enum2ListViewViewModel;
      if (viewModel != null)
      {
            Enum[] enumValues = viewModel.EnumToArray(new Enum2ListViewViewModel.MyType());
            myListEnum.Items.Clear();
            foreach(Enum enums in enumValues)
            {
                  myListEnum.Items.Add(enums.ToString());
                  // Note that the combo has strings values
                  // however, we going to update a Enum value
            }
      }
}


Como dice el comentario, en el combo vamos a poner string, pero vamos a bindearlo contra un enumeado. ¿Donde está la magia?
Pues la magia está en las funciones Converter.

Creamos una clase para convertir el valor, heredando de IValueConverter.


namespace KurroSoftware.Enum2ListView.Converters
{
    public class MyTypeEnumToStringConverter: IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value.ToString();
        }


        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (Enum2ListViewViewModel.MyType)Enum.Parse(typeof(Enum2ListViewViewModel.MyType), value.ToString(), true);
        }
    }
}

Como veras, usamos el Enum.Parse para convertir el string en el enumerado del tipo MyType.

Luego en el XAML, hacemos el binding del combo de la siguiente forma


    <ComboBox x:Name="myListEnum"
              Grid.Column="0"
              Grid.Row="0"
              HorizontalAlignment="Stretch"
              VerticalAlignment="Stretch" 
              SelectedValue="{Binding TypeEnum, Converter={StaticResource MyTypeEnum}, Mode=TwoWay}" 
              Grid.ColumnSpan="2" />


Como verás, esta accediendo directamente a la property TypeEnum que es del tipo MyEnum, pero usando el Converter, se hace la traducción string-enum.


    xmlns:converter="clr-namespace:KurroSoftware.Enum2ListView.Converters"
    ......


    <UserControl.Resources>
        <converter:MyTypeEnumToStringConverter x:Key="MyTypeEnum" />
    </UserControl.Resources>


Usando este pequeño truco, podemos hacer un binding directamente con el content.

Para rizar el rizo, y como estoy acostumbrado a la metodología de MVVM (Model-View-ViewModel), he usado la clase CommandDelegate para que la lógica del botón que está en la vista, esté siendo ejecutada en el ViewModel, en lugar del View.
Esto es sencillo usando el patrón Prism (ver http://msdn.microsoft.com/es-es/magazine/dd943055.aspx ), pero por no tener que usar todas las librerías de este patrón, he usado el CommandDelegate que publicó Kunal Chowdhury en CodeProject, (ver Step by Step Guide to Silverlight 4 Command Binding )

Bueno, pues ya sabes, el código en el siguiente enlace.
Enum2ComboBox.zip

Espero tus comentarios.

Comentarios

Publicar un comentario

Si quieres comentar, criticar, aportar mas informacion o simplemente felicitar, inserta tu comentario a continuacion. Entre todos podemos hacer cosas grandes.

Entradas populares de este blog

[VB] - Generar GUID

Esta si es buena... Como se nota que VB es un lenguaje con "solera", es decir, con años pero con robustez. Pero le pasa como al abuelo Cebolleta, tiene experiencia pero para los nuevos tiempos... ains.. le falta algo. Hoy en dia no sabriamos hacer nada sin un buen GUID, sobre todo si lo que queremos es identificar de forma unica y constante algun registro, objeto u otro componente. Usando SQL podemos generar un GUID en un santiamen a traves de la instrucción NEWID() , podemos crear un nuevo GUID en .NET usando la clase GUID.. pero... como lo hacemos con Visual Basic 6? Para empezar, vamos a ver en que se compone un GUID ¿Que es un GUID? Su significado es Globally Unique Identifier, osea Identificador globalmente único. Y su misión es la de proporcionar un identificador, de forma que es practicamente imposible que existan dos iguales en el mundo. Se compone de una palabra de 4 bytes, 3 palabras de 2 bytes y una de 6 bytes. Originalmente fue una idea de Microsoft pa

[.NET] Convertir Latitud y Longitud en Grados - Minutos y segundos

Hola a todos. Esta es una función para convertir un número de posición geográfica en grados, minutos y segundos. Como algunos pocos recordarán,una posición geográfica esta definida por latitud (Norte / Sur) y longitud (Este / Oeste) teniendo como referencia para la longitud el meridiano de Greenwich (Meridiano 0) y para la latitud la linea del Ecuador (Paralelo 0). Por lo que siempre hablaremos de posición " Grados Norte ", o " Grados Este ". Ahora es cuando entra en juego las matemáticas y la trigonometría (he de admitir que me encantan :D ). El hemisferio norte o sur solo tendría 90° Norte o Sur. Por ejemplo, El polo norte está a 90° 0' 0'' N de latitud. La longitud podríamos considerar el 0° 0' 0'' (estamos en el polo norte, por lo que es un solo punto, no hay longitud). En cambio, si nos movemos alrededor de la tierra por la linea de Ecuador, la latitud será 0° 0' 0'' (ni al norte, ni al sur) pero de Este a Oeste nos m