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 .
任何指导都会非常感激!
好的,经过一番挖掘,我觉得这让我很满意.我绑定到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)
(显然我的实际实现有点复杂/根据我原来的问题声明处理意外输入/使用反射).
无论如何,我想我会发布这个解决方案以防其他人试图做类似的事情,或者如果有更好的方法来做这个比我使用的更好.
| 归档时间: |
|
| 查看次数: |
17507 次 |
| 最近记录: |