我有一个ComboBox的以下(工作)XAML:
<ComboBox SelectedValue="{Binding SelectedItem}" ItemsSource="{Binding Items}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource MyEnumToStringConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我不喜欢这段代码:为了改变我的枚举表示为字符串的方式,我还必须指定ComboBox ItemTemplate的外观。如果我想全局更改所有ComboBox的外观怎么办?
另一种解决方案是在ItemSource绑定上指定转换器:
<ComboBox
SelectedValue="{Binding SelectedItem}"
ItemsSource="{Binding Items, Converter={StaticResource MyEnumToStringConverter}}" />
我不喜欢这个,因为我希望ComboBox存储我的真实类型,而不是它的字符串表示。
我还有其他选择吗?
答案 0 :(得分:1)
没有必要在Style中设置每个ComboBox的ItemTemplate
。
相反,您只需通过设置其DataType属性
为枚举类型创建默认的DataTemplate<Window.Resources>
<local:MyEnumStringConverter x:Key="MyEnumStringConverter"/>
<DataTemplate DataType="{x:Type local:MyEnum}">
<TextBlock Text="{Binding Converter={StaticResource MyEnumStringConverter}}"/>
</DataTemplate>
...
</Window.Resources>
答案 1 :(得分:0)
您可以创建一个新的MyEnumText
基于字符串的属性,该属性返回枚举值的Description
属性值,并将TextBlock.Text
属性绑定到它,如下所示:
<ComboBox SelectedValue="{Binding SelectedItem}" ItemsSource="{Binding Items}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding MyEnumText}"/> <!--Bound to new Text property-->
</DataTemplate>
</ComboBox.ItemTemplate>
将DescriptionAtrribute
属性添加到您的枚举值:
public enum MyEnum
{
[System.ComponentModel.Description("Value One")]
MyValue1 = 1,
[System.ComponentModel.Description("Value Two")]
MyValue2 = 2,
[System.ComponentModel.Description("Value Three")]
MyValue3 = 3
}
为Enum
类创建扩展方法:
public static class EnumHelper
{
public static string GetDescription(this Enum value)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name != null)
{
System.Reflection.FieldInfo field = type.GetField(name);
if (field != null)
{
System.ComponentModel.DescriptionAttribute attr =
Attribute.GetCustomAttribute(field,
typeof(System.ComponentModel.DescriptionAttribute)) as System.ComponentModel.DescriptionAttribute;
if (attr != null)
{
return attr.Description;
}
}
}
return null;
}
}
将新属性MyEnumText
添加到ViewModel:
public MyEnum MyEnumProperty { get; set; }
public string MyEnumText //New Property
{
get
{
return MyEnumProperty.GetDescription();
}
}
答案 2 :(得分:0)
OP在这里。我重新提出了适用于这个问题的问题here和got an answer。