Czy można użyć metody ObjectDataProvider do wiązania ListBox do wyliczenia i stylu w jaki sposób wyświetlić Attriibute opisu? Jeśli tak, to w jaki sposób można to zrobić ...?WPF Wiązanie ListBox do wyliczenia, wyświetlanie Atrybutu opisu
Odpowiedz
Tak, jest to możliwe. To zrobi to. Że mamy enum
public enum MyEnum
{
[Description("MyEnum1 Description")]
MyEnum1,
[Description("MyEnum2 Description")]
MyEnum2,
[Description("MyEnum3 Description")]
MyEnum3
}
Wtedy możemy użyć ObjectDataProvider jak
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>
I ListBox możemy ustawić ItemsSource do MyEnumValues i zastosować ItemTemplate z konwerterem.
<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>
I w konwerterze otrzymujemy opis i odesłać go
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;
}
}
Sposób GetEnumDescription prawdopodobnie powinien iść gdzieś indziej, ale masz pomysł :)
Jeśli łączysz się z Enum, możesz prawdopodobnie przekonwertować to do opisu przez IValueConverter.
Aby uzyskać opis, jak to zrobić, zobacz stronę Binding ComboBoxes to enums... in Silverlight!.
Aby uzyskać więcej informacji, patrz http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx.
Można zdefiniować plik ressource w twoim projekcie (plik * .resx). W tym pliku należy zdefiniować „key-value-par”, coś takiego:
"YellowCars" : "Yellow Cars",
"RedCars" : "Red Cars",
i tak dalej ...
Klawisze są równa się swoimi enum-wpisów, coś takiego:
public enum CarColors
{
YellowCars,
RedCars
}
i tak dalej ...
Podczas korzystania z WPF można zaimplementować w XAML-code, coś takiego:
<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>
Następnie należy napisać konwerter coś takiego:
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();
}
}
Moja odpowiedź przychodzi 7 lat za późno ;-) Ale może to mogą być wykorzystane przez kogoś innego!
Możliwe duplikaty http://stackoverflow.com/questions/1281490/binding-comboboxes-to-enums-in-silverlight. –