10

我有一堂课

public class Car 
{
    [Description("name of the car")]
    public string Name { get; set; }

    [Description("age of the car")]
    public int Age { get; set; }
}

是否有可能将描述属性绑定到标签内容。我正在寻找的解决方案不需要实例化 Car 对象。

4

5 回答 5

10

它不会是一个正确的绑定(这对于静态数据来说不是必需的),但您可以轻松地创建一个MarkupExtension来检索它,只需传递类型和属性名称并通过反射获取它。

大纲将类似于:

public Type Type { get; set; }
public string PropertyName { get; set; }

ProvideValue: Type.GetProperty(PropertyName)
                  .GetCustomAttributes(true)
                  .OfType<DescriptionAttribute>()
                  .First()
                  .Description
<!-- Usage example -->
Text="{me:Description Type=local:Car, PropertyName=Name}"
于 2012-09-19T10:31:54.003 回答
1

1 你创建一个Converter

public sealed class PropertyDescriptionConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return Binding.DoNothing;

            string propertyName = parameter as string;
            if (String.IsNullOrEmpty(propertyName))
                return new ArgumentNullException("parameter").ToString();

            Type type = value.GetType();

            PropertyInfo property = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance);
            if (property == null)
                return new ArgumentOutOfRangeException("parameter", parameter,
                    "Property \"" + propertyName + "\" not found in type \"" + type.Name + "\".").ToString();

            if (!property.IsDefined(typeof(DescriptionAttribute), true))
                return new ArgumentOutOfRangeException("parameter", parameter,
                    "Property \"" + propertyName + "\" of type \"" + type.Name + "\"" +
                    " has no associated Description attribute.").ToString();

            return ((DescriptionAttribute)property.GetCustomAttributes(typeof(DescriptionAttribute), true)[0]).Description;
        }

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

2 你插入你的资源

    <Window.Resources>
        <local:PropertyDescriptionConverter x:Key="PropertyDescriptionConverter" />
    </Window.Resources>

3 添加此绑定

"{Binding ConverterParameter=Name, Converter={StaticResource PropertyDescriptionConverter}}"
于 2012-09-19T10:32:44.503 回答
1

你不能,因为它是属性的元数据。您可以通过创建自定义绑定类来解决问题。

于 2012-09-19T10:30:07.113 回答
1

而不是字符串文字使用字符串常量来设置属性参数:

public class Car
{
    public const string CarNamePropertyDescription = "name of the car";
    
    [Description(CarNamePropertyDescription)]
    public string Name { get; set; }
}

可以通过{x:Static}扩展从 xaml 访问常量(不需要绑定,因为属性不会在运行时更改):

<Label Content="{x:Static namespace:Car.CarNamePropertyDescription}"/>
于 2021-03-17T08:50:04.630 回答
0

那么接下来创建一个reader类,读取类的属性并绑定reader类的属性。例如

public class Reader
{
   public Dictionary<string, string> Description {get; set;}
}

于 2012-09-19T10:33:16.270 回答