为ComboBox指定转换器

时间:2013-12-17 07:51:12

标签: c# wpf xaml

我有一个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存储我的真实类型,而不是它的字符串表示。

我还有其他选择吗?

3 个答案:

答案 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在这里。我重新提出了适用于这个问题的问题heregot an answer