我目前无法尝试此操作,因此这可能不准确,甚至不可能。只要我拿到一台可以尝试的电脑,我就会……直到那时,这只是理论。
我猜在您的复合控件中,每个数据绑定字段都会有类似的内容:
<TextBlock Text="{Binding FirstName, Mode=OneWay}" />
<TextBox Text="{Binding FirstName, Mode=TwoWay, ...}" />
您可能需要做些什么来创建一个转换器,该转换器将查看Display 属性的绑定数据,并将值转换为属性值。这将导致上面的块看起来像这样:
<TextBlock Text="{Binding FirstName, Mode=OneWay, Converter={StaticResource AttributeConverter}, ConverterParameter=Display}" />
<TextBox Text="{Binding FirstName, Mode=TwoWay, ...}" />
这里我传入了Display 作为参数,以防你想访问不同的属性。
这只是理论,因为我目前无法对此进行测试,并且无法回忆IValueConverter.Convert(object value, ...) 是否传递了有问题的对象,或者在这种情况下只是传递了字符串值。如果只是字符串值,则可能是不可能的,但如果是对象,则取决于您对反射命名空间的访问权限以评估属性。
我会尽快将场景放在一起尝试一下。
编辑:
由于某种原因,当我尝试在此编辑中粘贴代码时,语法荧光笔给了我手指
无论如何,在一个小项目中尝试过之后,它认为你做不到。
根据我制作 2 个数据绑定控件并为使用该属性的控件使用转换器的建议,我执行了以下操作:
- 为数据绑定控件创建了 xaml。
- 为测试创建自定义属性
- 创建了带有修饰属性的模型以进行测试。
- 创建了转换器以尝试从属性中读取属性。
这就是我被抓住的地方。我无法从 IValueConverter.Convert(...) 方法获取数据绑定类型。 value 参数和 targetType 参数一样以 String 形式出现。虽然这是主要的问题,但第二个问题是我无法动态识别控件数据绑定到的属性名称。这可能通过转换器参数来解决。
现在,如果我提供了带有修饰属性的测试模型的类型,那么我就能够读取属性值,这样就可以了,但我无法动态地动态识别类型。
我能想到的唯一其他方法是在数据真正绑定到您的自定义控件之前创建某种形式的观察者或转换器。
祝你好运