在 xaml 中访问 DisplayName

Posted

技术标签:

【中文标题】在 xaml 中访问 DisplayName【英文标题】:Access DisplayName in xaml 【发布时间】:2011-09-03 11:41:03 【问题描述】:

如何在 XAML 中访问 DisplayName 的值?

我有:

public class ViewModel 
  [DisplayName("My simple property")]
  public string Property 
    get  return "property";
  

XAML:

<TextBlock Text="Binding ??Property.DisplayName??"/>
<TextBlock Text="Binding Property"/>

有没有办法以这种或类似的方式绑定 DisplayName?最好的办法是使用此 DisplayName 作为 Resources 的键并展示 Resources 中的内容。

【问题讨论】:

【参考方案1】:

我会使用markup extension:

public class DisplayNameExtension : MarkupExtension

    public Type Type  get; set; 

    public string PropertyName  get; set; 

    public DisplayNameExtension()  
    public DisplayNameExtension(string propertyName)
    
        PropertyName = propertyName;
    

    public override object ProvideValue(IServiceProvider serviceProvider)
    
        // (This code has zero tolerance)
        var prop = Type.GetProperty(PropertyName);
        var attributes = prop.GetCustomAttributes(typeof(DisplayNameAttribute), false);
        return (attributes[0] as DisplayNameAttribute).DisplayName;
    

示例用法:

<TextBlock Text="m:DisplayName TestInt, Type=local:MainWindow"/>
public partial class MainWindow : Window

   [DisplayName("Awesome Int")]
   public int TestInt  get; set; 
   //...

【讨论】:

我也会使用 MarkupExtension,但它利用了自定义的可本地化 DisplayNameAttribute,如图所示 here @CodeNaked:好主意,虽然我知道本地化问题,但我自己并没有想到任何特定的方法。 如果基础类型是泛型对象,我们如何让它工作? @GauravGupta:拥有房产的类型?如果是这样,您需要m:DisplayName Property, Type=x:Type local:MyType`1 之类的东西,其中数字是指通用参数的数量。 Here's an example of using generics in XAML.【参考方案2】:

不确定这将如何扩展,但您可以使用转换器来获取您的 DisplayName。转换器看起来像:

public class DisplayNameConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        PropertyInfo propInfo = value.GetType().GetProperty(parameter.ToString());
        var attrib = propInfo.GetCustomAttributes(typeof(System.ComponentModel.DisplayNameAttribute), false);

        if (attrib.Count() > 0)
        
            return ((System.ComponentModel.DisplayNameAttribute)attrib.First()).DisplayName;
        

        return String.Empty;
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotImplementedException();
    

然后您在 XAML 中的绑定将如下所示:

Text="Binding Mode=OneWay, Converter=StaticResource ResourceKey=myConverter, ConverterParameter=MyPropertyName"

【讨论】:

以上是关于在 xaml 中访问 DisplayName的主要内容,如果未能解决你的问题,请参考以下文章

访问 XAML 中的静态字段

访问F#中的XAML(WPF)元素

我是不是可以从 XAML 构建模板中访问特定的 MSBuild 参数?

如何从 xaml 访问 UserControl 内的按钮?

访问另一个 CS 文件中的 XAML 对象

WPF应用程序中,调用用户控件时,可以访问到在这个用户控件Xaml代码中的所有内容,这样岂不是不安全?