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

时间:2009-11-24 23:35:45

标签: wpf xaml data-binding styles valueconverter

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

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

(如果您想知道,ItsPropertyName表示MyPropertyName类型的属性,其属性类似于[StringMaxLength(15)],我可以访问并返回值转换器。) 另外,有没有办法传递MyPropertyName的类型而不是实例?我只需要类型来执行StringMaxLength属性查找。

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

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

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

任何指导都会非常感激!

2 个答案:

答案 0 :(得分: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
  }
}

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

无论如何,我想我会发布这个解决方案,以防其他人试图做类似的事情,或者是否有更好的方法可以做到这一点而不是我正在使用。

答案 1 :(得分:4)

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

  <Setter
     Property="MaxLength">
     <Setter.Value>
        <Binding
           Converter="{StaticResource textFieldMaxLengthConverter}"
           RelativeSource="{RelativeSource TemplatedParent}"
           Path="MyPropertyName"
           ConverterParameter="TheirPropertyName" />
     </Setter.Value>
  </Setter>