在 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的主要内容,如果未能解决你的问题,请参考以下文章