在xaml中绑定枚举的显示名称属性

24 浏览
0 Comments

在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().Description;

然而,这对于XAML没有帮助。

0
0 Comments

从上述内容中可以看出,这个问题的出现是因为在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方法中的代码,确保获取的是正确的属性,并且修复了使用错误的属性类的问题。

0