在xaml中绑定枚举的显示名称属性
在xaml中绑定枚举的显示名称属性
我有以下枚举类型:
public enum ViewMode { [Display(Name = "新建")] New, [Display(Name = "编辑")] Edit, [Display(Name = "搜索")] Search }
我使用xaml和数据绑定来在窗口中显示枚举类型:
但是这不会显示显示名称属性。我该如何做?
在我的viewModel中,我可以通过使用扩展方法来获取显示名称属性:
public static class EnumHelper { ////// 获取枚举字段值上的属性 /// ///要检索的属性类型 /// 枚举值 ///存在于枚举值上的类型为T的属性 public static T GetAttributeOfType(this Enum enumVal) where T : System.Attribute { var type = enumVal.GetType(); var memInfo = type.GetMember(enumVal.ToString()); var attributes = memInfo[0].GetCustomAttributes(typeof(T), false); return (attributes.Length > 0) ? (T)attributes[0] : null; } }
使用方法是string desc = myEnumVariable.GetAttributeOfType
。
然而,这对于XAML没有帮助。
从上述内容中可以看出,这个问题的出现是因为在XAML中绑定了一个枚举的显示名称属性,但是在转换器的Convert方法中出现了空引用异常。通过调试可以确定,问题出现在Convert方法中获取属性的操作,即GetAttributeOfType方法返回了null。
解决这个问题的方法是,首先创建一个实现了System.Windows.Data.IValueConverter接口的转换器类,并将其指定为绑定的转换器。可以选择性地创建一个实现了System.Windows.Markup.MarkupExtension接口的“提供程序”类(实际上可以只使用一个类实现两者)。代码示例中的MyConverter类就是一个例子。
在XAML中使用这个转换器类时,通过设置Converter属性来指定转换器,并将绑定的值作为参数传入。代码示例中的Label控件就是一个使用了转换器的例子。
然而在实际使用中,发现出现了空引用异常。经过调试发现,问题出现在Convert方法中获取属性的操作上,即GetAttributeOfType方法返回了null。经过分析发现,这是因为Convert方法中尝试获取了System.ComponentModel.DescriptionAttribute属性,而实际上枚举成员使用的是System.ComponentModel.DataAnnotations.DisplayAttribute属性。由于这两个类都有Description属性,所以导致了混淆。此外,根据代码示例中的使用情况来看,可能应该获取的是Name属性。因此,需要更新Convert方法中的代码来解决问题。
解决这个问题的方法是更新Convert方法中的代码,确保获取的是正确的属性,并且修复了使用错误的属性类的问题。