获取绑定属性的PropertyInfo

时间:2018-08-01 07:00:27

标签: wpf binding converter propertyinfo

我要实现的是为属性指定特定的值,这些属性的值只能在设计器中显示,而不能在运行时显示。


所以在我的ViewModels中,我想用自定义属性装饰属性

[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=???}" />

如果是的话,我应该通过什么?

1 个答案:

答案 0 :(得分:1)

要从DesignTimeValueAttribute获取属性值,值转换器必须按如下方式使用Reflection:

((DisplayAttribute(typeof(className).GetProperty(propertyName).GetCustomAttribute(typeof(DisplayAttribute)))).DesignTimeValue;

要使用反射,需要做两件事:

  1. 这些属性位于的类的名称
  2. 财产名称

您可以将类名称的DependencyProperty添加到值转换器,或者创建MultiValueConverter并将类的名称作为绑定之一传递。

<UserControl.Resources>
    <local:DesignTimeValueConverter x:Key="myDesignTimeValueConverter" ClassName="MyNamespace.MyClass" />
</UserControl.Resources>

然后在属性上使用转换器,并将属性名称作为ConverterParameter传递:

<TextBlock Text="{Binding Test, Converter={StaticResource myDesignTimeValueConverter}, ConverterParameter=Test}" />