长版: 我有一个简单的WPF转换器,而不是日期转换。转换器基本上检查日期并以dd / M / yyyy格式格式化。转换器通过处理日期来做一些智能操作,这意味着用户可以键入“23061971”并将值转换为“23/06/1971”。
这一切都是微不足道的。问题是,当我更新值时,它不会更新插入位置。假设“|”是插入符和用户键入“23061971 |”然后一毫秒后更新为“230619 | 71”。
我想要做的是检测值末尾的插入符号 - 如果是,则在更新新值后将其移至编辑字段的末尾。为此,我需要访问转换器所连接的编辑控件。
简短版本: 从一个WPF转换器,我可以获得对该转换器绑定的控件的引用吗?
答案 0 :(得分:5)
这是一篇关于如何从转换器中直接访问控件的优秀文章:http://social.technet.microsoft.com/wiki/contents/articles/12423.wpfhowto-pass-and-use-a-control-in-it-s-own-valueconverter-for-convertconvertback.aspx
本质:
<MultiBinding Converter="{StaticResource MyConverter}" >
<Binding RelativeSource="{RelativeSource Self}" Mode="OneTime"/>
<Binding Path="MyValue2" />
</MultiBinding>
转换器values[0]
中的将成为您的控件,可以进行投射,而values[1]
将是您要绑定的数据。
答案 1 :(得分:2)
在ValueConverter中,您无法访问控件 - 但是如果您使用多值绑定与多值转换器,则可以访问。
在多重绑定中,第一个绑定就是你现在的绑定 - 没有转换器。绑定到控件本身的第二个绑定 - 在那里你可以访问控件。
我也使用这种方法来获取其他东西 - 你可以对你想要触发更新的属性进行“虚拟”绑定,即如果你绑定到控件本身,你只会在它改变时得到更新,而不是属性确实 - 所以为那些创建虚拟装订。
答案 2 :(得分:1)
您可以像这样使用MultiBinding发送控件。
<TextBox Height="100" x:Name="textbox1" DockPanel.Dock="Top">
<TextBox.Text>
<MultiBinding Converter="{StaticResource MultiConverter}">
<Binding ElementName="textbox1" Path="." />
</MultiBinding>
</TextBox.Text>
</TextBox>
答案 3 :(得分:0)
我不知道转换器有没有办法得到使用它的控件。将一个对象转换为另一个对象只是一个简单的逻辑。
但是,在您的情况下,也许您可以捕获更改事件,然后手动移动插入符号。如果你考虑一下,插入位置严格来说是一个观点;它与转换器或数据无关。你不应该用它加载视图控制器逻辑。你绝对不应该将转换器逻辑(在实用程序类下分类)加载它。