Kann die ObjectDataProvider-Methode verwendet werden, um eine ListBox an eine Enumeration zu binden und sie so zu formatieren, dass die Description attribute angezeigt wird? Wenn ja, wie würde man das machen ...?WPF Binden einer ListBox an eine Enumeration, Anzeigen des Beschreibungsattributs
Antwort
Ja, es ist möglich. Das wird es tun. Sagen wir die Enum haben
public enum MyEnum
{
[Description("MyEnum1 Description")]
MyEnum1,
[Description("MyEnum2 Description")]
MyEnum2,
[Description("MyEnum3 Description")]
MyEnum3
}
Dann können wir die Object als
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>
Und für die List-Box verwenden wir die Itemssource auf MyEnumValues und anzuwenden, um eine ItemTemplate mit einem Konverter eingestellt.
<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>
Und im Konverter erhalten wir die Beschreibung und senden Sie es
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;
}
}
Die GetEnumDescription Methode sollte wahrscheinlich woanders hingehen, aber Sie bekommen die Idee :)
Wenn Sie an die Enum binden, könnten Sie dies wahrscheinlich über einen IValueConverter in die Beschreibung konvertieren.
Eine Beschreibung dazu finden Sie unter Binding ComboBoxes to enums... in Silverlight!.
Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx.
Sie können eine Ressource-Datei definieren in Ihrem Projekt (* .resx-Datei). In dieser Datei müssen Sie „Schlüssel-Wert-Paare“, so etwas wie folgt definieren:
"YellowCars" : "Yellow Cars",
"RedCars" : "Red Cars",
und so weiter ...
Die Tasten sind gleich zu Ihrer ENUM-Einträge, so etwas wie folgt aus:
public enum CarColors
{
YellowCars,
RedCars
}
und so weiter ...
Wenn Sie WPF verwenden Sie in Ihrem XAML-Code so etwas wie dies umsetzen kann:
<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>
Dann müssen Sie Ihren Converter, so etwas schreiben:
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();
}
}
Meine Antwort kommt 7 Jahre zu spät ;-) Aber vielleicht kann es von jemand anderem verwendet werden!
- 1. Binden einer WPF-Listbox an eine Combobox
- 2. Liste an eine ListBox in WPF binden
- 3. DropDownList an eine Enumeration binden
- 4. WPF ListBox Bindung an Index des Elements
- 5. WPF Wie eine Enumeration mit Beschreibungen zu einer Combobox binden
- 6. Binden eines Typeconverter direkt an eine Enumeration
- 7. WPF: Sammlung mit Sammlung zu einer ListBox mit Gruppen binden
- 8. WPF- Gibt es eine Möglichkeit, an die SelectedValues einer TreeView und einer ListBox zu binden?
- 9. WPF-Bindung an Listbox selectedItem
- 10. wpf binden an Indexer
- 11. WPF-Datenbindung: Wie binden Daten eine Enumeration an ein Kombinationsfeld mit XAML?
- 12. WPF: Wie an eine geschachtelte Eigenschaft binden?
- 13. WPF: Ein Label an eine Klasseneigenschaft binden
- 14. Binden eines WPF DataGrid an eine DataTable
- 15. Listbox an Liste binden <object>
- 16. An eine ListBox von UserControl Elements binden? Diese
- 17. Mehrere Felder an Listbox in ASP.NET binden
- 18. WPF Listbox nächstes Element nach SelectedItem anzeigen
- 19. WPF-Listbox leeres Datatemplate
- 20. anzeigen ToolTip eines abgestumpften WPF ListBox Artikel
- 21. Wie binden Sie eine ListBox an eine Eigenschaft vom Typ List für ein Objekt?
- 22. WPF Filter eine ListBox
- 23. Binden von TextBox an Objekt WPF
- 24. WPF-Zugriffskontrollen in einer DataTemplate einer ListBox
- 25. WPF-ListBox + Bindung + IDataErrorInfo =?
- 26. WPF-Datenbindung: Wie binden Daten eine Sammlung?
- 27. WPF ListBox mit einer ListBox - UI Virtualisierung und Scrolling
- 28. Sortieren einer ListBox in WPF
- 29. (WPF) Zwei Klassen an ein Steuerelement binden
- 30. Warum kann ich an ListBox aber nicht an DataGrid in WPF binden?
Mögliches Duplikat von http://stackoverflow.com/questions/1281490/binding-comboboxes-to-enums-in-silverlight. –