带有AutoGenerateColumns的WPF DataGrid中枚举值的Description属性

带有AutoGenerateColumns的WPF DataGrid中枚举值的Description属性,wpf,mvvm,binding,datagrid,combobox,Wpf,Mvvm,Binding,Datagrid,Combobox,这是我的枚举: enum Foo { [Description("the quick")] Bar, [Description("brown fox")] Baz, [Description("jumped over")] Qux } 以下是我的ViewModel的一部分: class MainWindowViewModel : ViewModelBase { public ObservableCollection<RowView

这是我的枚举:

enum Foo 
{
    [Description("the quick")]
    Bar,
    [Description("brown fox")]
    Baz,
    [Description("jumped over")]
    Qux
}
以下是我的ViewModel的一部分:

class MainWindowViewModel : ViewModelBase
{
    public ObservableCollection<RowViewModel> Rows { get { ... } }
}

class RowViewModel : ViewModelBase 
{
    public String Name { get { ... } set { ... } }
    public Foo Foo { get { ... } set { ... } }
}

不幸的是,这不起作用:单元格有值时显示为空,而组合框下拉列表包含原始枚举值,而不是说明。

由于枚举不是一个可更改的项,因此您的工作太辛苦了,在VM构造期间,枚举枚举并将描述提取到列表中,然后将控件绑定到该列表


例子 以我们的枚举为例

public enum TheNums
{
    [Description("One")]
    Alpha,
    [Description("Two")]
    Beta,
    [Description("Three")]
    Gamma
}
提取描述的扩展方法

public static class AttributeExtension
{

/// <summary>If an attribute on an enumeration exists, this will return that 
/// information</summary> 
/// <param name="value">The object which has the attribute.</param> 
/// <returns>The description string of the attribute or string.empty</returns> 
public static string GetAttributeDescription(this object value)
{
    string retVal = string.Empty;
    try
    {
        retVal = value.GetType()
                      .GetField(value.ToString())
                      .GetCustomAttributes(typeof(DescriptionAttribute), false)
                      .OfType<DescriptionAttribute>()
                      .First()
                      .Description;

    }
    catch (NullReferenceException)
    {
        //Occurs when we attempt to get description of an enum value that does not exist 
    }
    finally
    {
        if (string.IsNullOrEmpty(retVal))
            retVal = "Unknown";
    }

    return retVal;
}

}
然后在我的页面上,我将直接绑定到它,因为它的Listbox包含页面的datacontext,即
EnumDescriptions

<ListBox ItemsSource="{Binding}" Width="100" Height="200"/>

结果是:


请注意,在MVVM实现中,整个VM实例很可能是页面的数据上下文,因此绑定需要知道数据上下文/VM实例之外的属性名称(其绑定路径),因此,请使用
Binding enumscriptions
Binding Path=enumscriptions

如何将控件绑定到列表?@Dai按照您的意愿正常绑定它。请参阅提供的快速示例。感谢您提供的示例-您可以使用动态创建的CheckBox DataGrid列为我的原始场景修改它吗?@Dai我有一个自己的最后期限,必须先完成这项工作,但是,我没有看到您正在做的设计,因此我给您错误内容的可能性非常高。
public List<string> EnumDescriptions { get; set; }
public MainWindow()
{
    InitializeComponent();
    EnumDescriptions = new List<string>()
    {
        TheNums.Alpha.GetAttributeDescription(),
        TheNums.Beta.GetAttributeDescription(),
        TheNums.Gamma.GetAttributeDescription()
    };

    DataContext = EnumDescriptions;
}
EnumDescriptions = new List<string>()
{
    TheNums.Alpha.GetAttributeDescription(),
    TheNums.Beta.GetAttributeDescription(),
    TheNums.Gamma.GetAttributeDescription()
};
public List<string> EnumDescriptions { get; set; }
public MainWindow()
{
    InitializeComponent();
    EnumDescriptions = new List<string>()
    {
        TheNums.Alpha.GetAttributeDescription(),
        TheNums.Beta.GetAttributeDescription(),
        TheNums.Gamma.GetAttributeDescription()
    };

    DataContext = EnumDescriptions;
}
<ListBox ItemsSource="{Binding}" Width="100" Height="200"/>