WPF绑定到另一个属性的样式绑定

Jor*_*Day 2 data-binding wpf xaml styles valueconverter

我不确定提出这个问题的最佳方式(对于含糊不清的问题标题感到抱歉),但实际上我想使用从数据上下文传递属性的值转换器在TextBox上设置MaxLength属性,和传入属性的属性作为转换器参数.我希望以一种风格来做所有这些,而不是逐个控制.以下是以非样式方式执行此操作的示例:

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" MaxLength="{Binding MyPropertyName, Converter={StatocRespirceMyCoolConverter}, ConverterParameter=TheirPropertyName}" />
Run Code Online (Sandbox Code Playgroud)

(如果您想知道,ItsPropertyName表示MyPropertyName类型的属性,它具有[StringMaxLength(15)]等属性,我可以在值转换器中找到并返回.)此外,是否有传递MyPropertyName类型而不是实例的任何方式?我只需要类型来执行StringMaxLength属性查找.

无论如何,我怎么能在风格上做这样的事情呢?我已经达到了:

<Setter Property="MaxLength">
    <Setter.Value>
        <Binding Converter="{StaticResource textFieldMaxLengthConverter}" />
    </Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)

但是这会将整个datacontext传递给值转换器,而不是MyPropertyName对象,我真的不知道如果我可以解析MyPropertyName.TheirPropertyName部分绑定以在绑定的ConverterParameter属性上传递ItsPropertyName .

任何指导都会非常感激!

Jor*_*Day 5

好的,经过一番挖掘,我觉得这让我很满意.我绑定到RelativeSource Self然后解析Text属性上的绑定表达式(因为这是一个TextFieldMaxLength转换器,我假设我正在对TextBox工作.

资源字典中的样式:

<Style TargetType="TextBox"> 
  <Setter Property="MaxLength">
    <Setter.Value>
      <Binding Converter="{StaticResource textFieldMaxLengthConverter}" RelativeSource="{RelativeSource Self}" />
    </Setter.Value>
  </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

用法(基本上没有任何特殊需要做,因为它的风格都是这样):

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" />
Run Code Online (Sandbox Code Playgroud)

textFieldMaxLengthConverter的Convert方法:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
  Control control = value as Control;
  BindingExpression be = control.GetBindingExpression(TextBox.TextProperty);
  if (be != null)
  {
    string boundPropertyName = be.ParentBinding.Path.Path;
    // .. boundPropertyName here is MyPropertyName.TheirPropertyname, do some parsing and return a value based on that
  }
}
Run Code Online (Sandbox Code Playgroud)

(显然我的实际实现有点复杂/根据我原来的问题声明处理意外输入/使用反射).

无论如何,我想我会发布这个解决方案以防其他人试图做类似的事情,或者如果有更好的方法来做这个比我使用的更好.