带有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"/>