获取绑定 属性 的 PropertyInfo
Get the bound property's PropertyInfo
我想要实现的是为只应在设计器中而不是在运行时显示的属性指定特定值。
所以在我的 ViewModel 中,我想用自定义属性装饰属性
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class DesignTimeValueAttribute : Attribute
{
public object Value { get; }
public DesignTimeValueAttribute(object value)
{
this.Value = value;
}
}
例如这个:
private string test;
[DesignTimeValue("Hello World")]
public string Test
{
get { return this.test; }
set
{
if(this.test != value)
{
this.test = value;
this.RaisePropertyChanged();
}
}
}
在 XAML 部分,我想像这样绑定到那个 属性:
<Window.Resources>
<DesignTimeValueConverter x:Key="DesignTimeValueConverter" />
</Window.Resources>
<Grid>
<TextBox Text="{Binding Test, Converter={StaticResource DesignTimeValueConverter}}" />
</Grid>
到目前为止一切顺利。 DesignTimeValueConverter
应该 看起来像这样(伪代码):
public class DesignTimeValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (DesignerProperties.GetIsInDesignMode(this))
{
PropertyInfo propertyInfo = ...; // What can I put here?
DesignTimeValueAttribute attribute = propertyInfo.GetCustomAttribute<DesignTimeValueAttribute>();
if(attribute != null)
{
return attribute.Value;
}
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
但我不知道是否有办法获取绑定属性PropertyInfo
。
如何访问 IValueConverter
中的实际 属性,而不仅仅是值及其类型?
我可以传递什么作为转换器参数,例如我可以使用
<TextBox Text="{Binding Test, Converter={StaticResource DesignTimeValueConverter}, ConverterParameter=???}" />
如果是,我应该通过什么?
要从 DesignTimeValueAttribute 获取属性值,值转换器必须使用反射,如下所示:
((DisplayAttribute(typeof(className).GetProperty(propertyName).GetCustomAttribute(typeof(DisplayAttribute)))).DesignTimeValue;
要使用反射,它需要两件事:
- class 这些属性的名称在
- 属性
的名称
您可以将 class 名称的 DependencyProperty 添加到您的值转换器或创建一个 MultiValueConverter 并将 class 的名称作为绑定之一传递。
<UserControl.Resources>
<local:DesignTimeValueConverter x:Key="myDesignTimeValueConverter" ClassName="MyNamespace.MyClass" />
</UserControl.Resources>
然后在 属性 上使用转换器,并将 属性 的名称作为 ConverterParameter 传递:
<TextBlock Text="{Binding Test, Converter={StaticResource myDesignTimeValueConverter}, ConverterParameter=Test}" />
我想要实现的是为只应在设计器中而不是在运行时显示的属性指定特定值。
所以在我的 ViewModel 中,我想用自定义属性装饰属性
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class DesignTimeValueAttribute : Attribute
{
public object Value { get; }
public DesignTimeValueAttribute(object value)
{
this.Value = value;
}
}
例如这个:
private string test;
[DesignTimeValue("Hello World")]
public string Test
{
get { return this.test; }
set
{
if(this.test != value)
{
this.test = value;
this.RaisePropertyChanged();
}
}
}
在 XAML 部分,我想像这样绑定到那个 属性:
<Window.Resources>
<DesignTimeValueConverter x:Key="DesignTimeValueConverter" />
</Window.Resources>
<Grid>
<TextBox Text="{Binding Test, Converter={StaticResource DesignTimeValueConverter}}" />
</Grid>
到目前为止一切顺利。 DesignTimeValueConverter
应该 看起来像这样(伪代码):
public class DesignTimeValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (DesignerProperties.GetIsInDesignMode(this))
{
PropertyInfo propertyInfo = ...; // What can I put here?
DesignTimeValueAttribute attribute = propertyInfo.GetCustomAttribute<DesignTimeValueAttribute>();
if(attribute != null)
{
return attribute.Value;
}
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
但我不知道是否有办法获取绑定属性PropertyInfo
。
如何访问 IValueConverter
中的实际 属性,而不仅仅是值及其类型?
我可以传递什么作为转换器参数,例如我可以使用
<TextBox Text="{Binding Test, Converter={StaticResource DesignTimeValueConverter}, ConverterParameter=???}" />
如果是,我应该通过什么?
要从 DesignTimeValueAttribute 获取属性值,值转换器必须使用反射,如下所示:
((DisplayAttribute(typeof(className).GetProperty(propertyName).GetCustomAttribute(typeof(DisplayAttribute)))).DesignTimeValue;
要使用反射,它需要两件事:
- class 这些属性的名称在
- 属性 的名称
您可以将 class 名称的 DependencyProperty 添加到您的值转换器或创建一个 MultiValueConverter 并将 class 的名称作为绑定之一传递。
<UserControl.Resources>
<local:DesignTimeValueConverter x:Key="myDesignTimeValueConverter" ClassName="MyNamespace.MyClass" />
</UserControl.Resources>
然后在 属性 上使用转换器,并将 属性 的名称作为 ConverterParameter 传递:
<TextBlock Text="{Binding Test, Converter={StaticResource myDesignTimeValueConverter}, ConverterParameter=Test}" />