¿Es posible utilizar el método ObjectDataProvider para vincular un ListBox a una enumeración y darle un estilo de alguna manera para mostrar el atributo de descripción? Si es así, ¿cómo haría uno para hacer esto ...?WPF Enlazando un ListBox a una enumeración, mostrando el atributo de descripción
Respuesta
Sí, es posible. Esto lo hará. Digamos que tenemos la enumeración
public enum MyEnum
{
[Description("MyEnum1 Description")]
MyEnum1,
[Description("MyEnum2 Description")]
MyEnum2,
[Description("MyEnum3 Description")]
MyEnum3
}
Entonces podemos usar el ObjectDataProvider como
xmlns:MyEnumerations="clr-namespace:MyEnumerations"
<ObjectDataProvider MethodName="GetValues"
ObjectType="{x:Type sys:Enum}"
x:Key="MyEnumValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="MyEnumerations:MyEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
Y para el ListBox nos fijamos el ItemsSource a MyEnumValues y aplicar un ItemTemplate con un convertidor.
<ListBox Name="c_myListBox" SelectedIndex="0" Margin="8"
ItemsSource="{Binding Source={StaticResource MyEnumValues}}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Y en el convertidor obtenemos la descripción y devolverlo
public class EnumDescriptionConverter : IValueConverter
{
private string GetEnumDescription(Enum enumObj)
{
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
{
return enumObj.ToString();
}
else
{
DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute;
return attrib.Description;
}
}
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Enum myEnum = (Enum)value;
string description = GetEnumDescription(myEnum);
return description;
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return string.Empty;
}
}
El método GetEnumDescription probablemente debería ir a otro lugar, pero usted consigue la idea :)
Si se une al Enum, probablemente podría convertir esto a la descripción a través de un IValueConverter.
Consulte Binding ComboBoxes to enums... in Silverlight! para obtener una descripción de cómo lograr esto.
Consulte http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx para obtener más información.
Se puede definir un archivo ressource en su proyecto (archivo * .resx). En este archivo se debe definir "key-value-pairs", algo como esto:
"YellowCars" : "Yellow Cars",
"RedCars" : "Red Cars",
y así sucesivamente ...
Las teclas son iguales a sus ENUM entradas, algo como esto:
public enum CarColors
{
YellowCars,
RedCars
}
y así sucesivamente ...
Cuando se utiliza WPF se puede implementar en su XAML-Code, algo como esto:
<ComboBox ItemsSource="{Binding Source={StaticResource CarColors}}" SelectedValue="{Binding CarColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource CarColorConverter}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Entonces usted debe escribir su convertidor, algo como esto:
using System;
using System.Globalization;
using System.Resources;
using System.Windows.Data;
public class CarColorConverter : IValueConverter
{
private static ResourceManager CarColors = new ResourceManager(typeof(Properties.CarColors));
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var key = ((Enum)value).ToString();
var result = CarColors.GetString(key);
if (result == null) {
result = key;
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Mi respuesta llega tarde a 7 años ;-) Pero tal vez puede ser utilizado por otra persona!
- 1. Get Enumeración de atributo Descripción
- 2. Enlazando un ComboBox a una enumeración anidada en una clase
- 3. WPF: Enlazando una etiqueta a una propiedad de clase
- 4. ¿Cómo puedo vincular una enumeración a mi listbox?
- 5. WPF vinculante a Listbox selectedItem
- 6. WPF: Agregar una imagen a un ListBox ItemTemplate
- 7. Encuadernación de una enumeración a un ComboBox en WPF + MVVM
- 8. Display Descripción Enumeración de jqGrid en lugar de la enumeración
- 9. Encontrar un valor enum por su Descripción Atributo
- 10. Agregar mi propio atributo de descripción a un Pandas DataFrame
- 11. ¿Existe una descripción gráfica de la enumeración de HatchStyle?
- 12. Enlazando un CollectionViewSource dentro de un DataTemplate
- 13. El atributo llamado 'descripción' causa bloqueo
- 14. .NET enlace de datos un cuadro combinado a una enumeración de la cadena con atributos Descripción
- 15. WPF Listbox Wrapping
- 16. WPF ListBox editable
- 17. Multicolumn ListBox en WPF
- 18. WPF listbox empty datatemplate
- 19. Wpf- ¿Imposible lanzar MenuItem a Listbox?
- 20. WPF ListBox OnScroll Evento
- 21. WPF Listbox + Expander events
- 22. WPF Color de selección ListBox
- 23. mostrando texto seleccionable WPF
- 24. Animate WPF Datatemplate cuando el elemento se agregó a Listbox?
- 25. Cadena a Enum con descripción
- 26. WPF ListBox con ListBox - Virtualización de UI y Desplazamiento
- 27. WPF: deshabilita ListBox, pero habilita el desplazamiento
- 28. WPF ListBox Desplácese hasta el final automáticamente
- 29. Enlazando a antepasados dentro de un ResourceDictionary
- 30. WPF ListBox que establece sus elementos horizontalmente
Posible duplicado de http://stackoverflow.com/questions/1281490/binding-comboboxes-to-enums-in-silverlight. –