我不确定提出这个问题的最好方法(对于含糊不清的问题标题感到抱歉),但实际上我想在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绑定。
任何指导都会非常感激!
答案 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>