为了确保 WPF 中的绑定以现有属性为目标,我使用了静态属性名称属性。
现在,我不想将有关我的属性的更多信息封装到静态属性描述对象、名称、类型、ID 等中,但不必为名称提供一个可路径绑定的属性,并为所有其他信息提供一个属性。
问题是 WPF 抱怨属性类型错误,而不是 String 而是 PropertyInfo。
我试图以某种方式绕过这个限制。例如,我尝试让我的 PropertyInfo 隐式转换为字符串,覆盖 ToString 并将 PropertyInfo 中的 TypeConverter 添加到字符串和 PropertyInfo 中的字符串。没有任何效果。
而且我也不能直接绑定到 Name 属性。
<TextBlock Text="{Binding Path={x:Static l:Test.TitleProperty}}" />
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TypeDescriptor.AddAttributes(typeof(string),
new TypeConverterAttribute(typeof(StringFromPropertyConverter)));
DataContext = new Test { Title = "hello" };
}
}
public class Test
{
public static readonly PropertyInfo TitleProperty =
new PropertyInfo { Name = "Title" };
public string Title { get; set; }
}
[TypeConverter(typeof(PropertyToStringConverter))]
public class PropertyInfo
{
public string Name { get; set; }
public static implicit operator string(PropertyInfo p) { return p.Name; }
public override string ToString()
{
return Name;
}
}
public class PropertyToStringConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context,
Type destinationType)
{
if (destinationType == typeof(string)) return true;
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value,
Type destinationType)
{
return ((PropertyInfo)value).Name;
}
}
public class StringFromPropertyConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context,
Type sourceType)
{
if (sourceType == typeof(PropertyInfo)) return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value)
{
return ((PropertyInfo)value).Name;
}
}
有什么建议么?