2

我不确定提出这个问题的最佳方式(对不起,问题标题模棱两可),但基本上我想使用从数据上下文中传递的属性值转换器在 TextBox 上设置 MaxLength 属性,并将传入属性上的属性作为转换器参数。我想以一种风格来做这一切,而不是在逐个控制的基础上。这是以非样式方式执行此操作的示例:

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" MaxLength="{Binding MyPropertyName, Converter={StatocRespirceMyCoolConverter}, ConverterParameter=TheirPropertyName}" />

(如果您想知道,ThirdPropertyName 表示 MyPropertyName 类型上的一个属性,该属性具有类似 [StringMaxLength(15)] 的属性,我可以在值转换器中获取并返回该属性。)此外,是否有有什么方法可以传入 MyPropertyName 的类型而不是实例?我只需要类型来进行 StringMaxLength 属性查找。

无论如何,我怎么能以一种风格去做这样的事情呢?我已经做到了:

<Setter Property="MaxLength">
    <Setter.Value>
        <Binding Converter="{StaticResource textFieldMaxLengthConverter}" />
    </Setter.Value>
</Setter>

但这会将整个数据上下文传递给值转换器,而不是 MyPropertyName 对象,而且我真的不知道是否可以让它解析绑定的 MyPropertyName.TheirPropertyName 部分以在绑定的 ConverterParameter 属性上传递 TheyPropertyName .

任何指导将不胜感激!

4

2 回答 2

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>

用法(基本上没有什么特别需要做的,因为它都是风格):

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" />

textFieldMaxLengthConverter 的转换方法:

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
  }
}

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

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

于 2009-11-25T19:48:38.747 回答
4

您可以通过使用多重绑定将 lutiple 属性传递给您的转换器,这允许您根据需要对任意属性进行绑定,并且如果任何属性发生更改(即实现 INotifyPropertyChanged),则将重新评估绑定。对于您正在做的事情,您将不得不使用反射在传入的对象上查找具有与您的转换器参数匹配的特定属性名称的属性。我认为您最终不会使用下面的代码,但它表明您可以在 xaml 中为您的绑定设置多个参数。包括路径、转换器、转换器参数。我不确定相对来源,但我认为你可能需要它来做你想做的事。查看调试数据绑定以获得调试的好方法。这种技术是必不可少的。我不断地使用它。

  <Setter
     Property="MaxLength">
     <Setter.Value>
        <Binding
           Converter="{StaticResource textFieldMaxLengthConverter}"
           RelativeSource="{RelativeSource TemplatedParent}"
           Path="MyPropertyName"
           ConverterParameter="TheirPropertyName" />
     </Setter.Value>
  </Setter>
于 2009-11-25T00:37:11.960 回答