WPF のバインディングが既存のプロパティをターゲットにしていることを確認するために、静的プロパティ名プロパティを使用しています。
ここで、プロパティに関する詳細情報を静的プロパティ記述オブジェクト、Name、Type、Id などにカプセル化する必要はありませんが、名前のパスバインド可能なプロパティを 1 つと、他のすべての情報を含むプロパティを 1 つ持つ必要はありません。
問題は、WPF がプロパティの型が String ではなく PropertyInfo であると不平を言うことです。
私は何とかこの制限を回避しようとしています。たとえば、PropertyInfo を暗黙的に文字列にキャスト可能にし、ToString をオーバーライドして、PropertyInfo から文字列へ、および PropertyInfo から文字列への TypeConverter の両方を追加しようとしました。何も機能しません。
また、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;
}
}
助言がありますか?