2009-11-24 114 views
2

我不知道问这个问题的最佳方式(对于不明确的问题标题抱歉),但基本上我想设置一个TextBox的MaxLength属性使用一个值转换器,它从数据上下文中传递属性,并将传入属性的属性作为转换器参数。我想以一种风格去做所有这些,而不是一个控制一个控制的基础。下面是一个非风格的方式这样做的一个示例:WPF绑定到另一个属性的风格绑定

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

(在你想知道的情况下,TheirPropertyName表示在具有像一个属性类型MyPropertyName的属性[StringMaxLength(15)],其我可以到达并返回值转换器。) 此外,有没有什么办法可以传递MyPropertyName类型而不是实例?我只需要该类型来执行StringMaxLength属性查找。

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

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

但是,经过整体的datacontext中的值转换器,而不是在MyPropertyName对象,我真的不知道,如果我可以把它解析MyPropertyName.TheirPropertyName绑定的一部分在绑定的ConverterParameter属性上传递TheirPropertyName。

任何指导将非常感激!

回答

5

好吧,经过一些更深入的挖掘,我已经认识到这一点令我满意。我结合的RelativeSource自我,然后解析的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 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 
    } 
} 

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

无论如何,我认为我会张贴这个解决方案,以防其他人试图做类似的事情,或者如果可能有更好的方法来做到这一点比我使用的。

+0

+1 ...感谢分享!你能发布你的ValueConverter的实际实现吗? – Brent 2011-09-05 19:47:13

+0

嗨布伦特。对不起,当我问这个问题时,我曾在一位前雇主那里工作过,因为我已经不在那里了,所以我不能真正查看我在使用这个工具。我猜我可能使用了boundPropertyName字符串中的值,并对此进行了一些反思,看看是否将StringMaxLengthAttribute应用于该属性,并将该属性的值从该属性中提取出来(如果存在)。 – Jordan0Day 2011-09-06 19:27:59

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> 
+0

感谢您的提示,我将检查该调试方法。 – Jordan0Day 2009-11-25 15:15:10