Enum 2-way与Combobox绑定

时间:2013-03-28 09:27:34

标签: c# wpf data-binding

我正在尝试使用枚举到Combobox进行简单的双向绑定,但到目前为止还没有找到任何可用于我的代码的内容。

我的枚举(C#):

public enum CurrenciesEnum { USD, JPY, HKD, EUR, AUD, NZD };

Enum应设置/绑定的属性:

    private string _ccy;
    public string Ccy
    {
        get
        {
            return this._ccy;
        }
        set
        {
            if (value != this._ccy)
            {
                this._ccy= value;
                NotifyPropertyChanged("Ccy");
            }
        }
    }

不起作用的Xaml代码:

    <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
        <ObjectDataProvider x:Key="Currencies" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="ConfigManager:CurrenciesEnum" />
                </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </ResourceDictionary>
</UserControl.Resources>

<ComboBox ItemsSource="{Binding Source={StaticResource Currencies}}" SelectedItem="{Binding Ccy, Mode=TwoWay}"/>

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

问题是您将Enum绑定到string,由于绑定引擎中的默认ToString操作,这只会以一种方式工作。

如果您仅使用string值将ObjectDataProvider方法名称更改为GetNames,则会返回Enum的字符串值,并且会绑定两种方式,其他选项是不绑定到字符串,而是Enum类型。

    <ObjectDataProvider x:Key="Currencies" MethodName="GetNames" ObjectType="{x:Type System:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="ConfigManager:CurrenciesEnum" />
            </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

答案 1 :(得分:0)

我将枚举加载到词典

public static Dictionary<T, string> EnumToDictionary<T>()
        where T : struct
{
    Type enumType = typeof(T);

    // Can't use generic type constraints on value types,
    // so have to do check like this
    if (enumType.BaseType != typeof(Enum))
        throw new ArgumentException("T must be of type System.Enum");

    Dictionary<T, string> enumDL = new Dictionary<T, string>();
    //foreach (byte i in Enum.GetValues(enumType))
    //{
    //    enumDL.Add((T)Enum.ToObject(enumType, i), Enum.GetName(enumType, i));
    //}
    foreach (T val in Enum.GetValues(enumType))
    {
        enumDL.Add(val, val.ToString());
    }
    return enumDL;
}