简单的问题,假设我有这个TextBox(事实上,我确实有):
<TextBox.Text>
<Binding Path="MySourceProperty"
Mode="OneWayToSource"
UpdateSourceTrigger="PropertyChanged" />
</TextBox.Text>
只要其Text属性发生更改,它就会成功地更新MySourceProperty。除此之外,我还想在TextBox集中时更新MySourceProperty。
有没有办法为一个控件设置两个UpdateSourceTriggers
关于详细信息,我有一个包含绑定到MySourceProperty的Label的父视图,以及另一个包含TextBox和ComboBox的视图。
因此,当发生以下任何事件时,MySourceProperty都应该更新:
- TextBox.文本更改
- ComboBox.SelectedItem更改
- 文本框聚焦
- 组合框集中注意力
最后两个事件显然在这里,因为将焦点赋予控件不会更改其Text或SelectedItem属性,因此也不会更新MySourceProperty。
编辑:为了清楚我想要什么,我用粗体写了这个问题。我可以通过在代码背后使用事件处理程序来解决这个问题,但我正在努力摆脱我的WinForms习惯。但如果这是唯一的解决方案,请随时回答。
不确定这是否有助于Kilazur
正如Erno所提到的,我会先尝试一下,如果这不适合你的场景,那么我也做了类似的事情。
- 将UpdateSourceTrigger设置为Explicit
TextBox Name="itemNameTextBox"Text="{Binding Path=ItemName,UpdateSourceTrigger=Explicit}"
-
然后在代码隐藏中的各个事件中调用UpdateSource(您在上面提到过)。
// itemNameTextBox is an instance of a TextBox BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty); be.UpdateSource();
从这里引用
您可能希望将这些表示实体的控件放在单个数据模板或用户控件中。然后将该控件的datacontext绑定到组合框的选定项。绑定现在将相对于所选项目,并将自动更新。无需处理焦点或多个更新触发器。
有没有办法为一个控件设置两个UpdateSourceTriggers?`
你的问题的答案是否定的。即使是剂量,另一个触发器也是LostFocus
。
如果你真的像你说的那样:
我可以通过在代码背后使用事件处理程序来解决这个问题,但我正在努力摆脱我的WinForms习惯。
然后根据我的理解:您使用两个控件TextBox
和ComboBox
来更新单个属性MySourceProperty
。我的建议是,您应该使用TwoWay
绑定,或者您可以通过使用ComboBox
和设置为true的ComboBox.IsEditable
,并使用ComboBox.Text
和ComboBox.SelectedItem
与您的MySourceProperty
进行数据绑定来将它们组合。
编辑
:如果您确实需要按照当前的方式执行,那么与其只使用一个属性,不如将TextBox.Text
和ComboBox.SelectedItem
绑定到两个不同的属性。然后,您的MySourceProperty
应该根据它们的焦点状态返回其中任何一个。