我有一堂课
public class Car
{
[Description("name of the car")]
public string Name { get; set; }
[Description("age of the car")]
public int Age { get; set; }
}
是否有可能将描述属性绑定到标签内容。我正在寻找的解决方案不需要实例化 Car 对象。
我有一堂课
public class Car
{
[Description("name of the car")]
public string Name { get; set; }
[Description("age of the car")]
public int Age { get; set; }
}
是否有可能将描述属性绑定到标签内容。我正在寻找的解决方案不需要实例化 Car 对象。
它不会是一个正确的绑定(这对于静态数据来说不是必需的),但您可以轻松地创建一个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}"
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}}"
你不能,因为它是属性的元数据。您可以通过创建自定义绑定类来解决问题。
而不是字符串文字使用字符串常量来设置属性参数:
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}"/>
那么接下来创建一个reader类,读取类的属性并绑定reader类的属性。例如
public class Reader
{
public Dictionary<string, string> Description {get; set;}
}