C# 一个控件的多个UpdateSourceRigger
简单的问题,假设我有这个文本框(事实上,我有):C# 一个控件的多个UpdateSourceRigger,c#,wpf,updatesourcetrigger,C#,Wpf,Updatesourcetrigger,简单的问题,假设我有这个文本框(事实上,我有): 每当MySourceProperty的文本属性发生更改时,它将成功地更新MySourceProperty。除此之外,我还想在文本框聚焦时更新MySourceProperty 有没有办法让一个控件有两个UpdateSourceRigger? 关于详细信息,我有一个父视图,其中包含一个绑定到MySourceProperty的标签,还有一个视图,其中包含一个文本框和一个组合框 因此,当发生以下任何事件时,应更新MySourceProperty:
每当MySourceProperty的文本属性发生更改时,它将成功地更新MySourceProperty。除此之外,我还想在文本框聚焦时更新MySourceProperty
有没有办法让一个控件有两个UpdateSourceRigger?
关于详细信息,我有一个父视图,其中包含一个绑定到MySourceProperty的标签,还有一个视图,其中包含一个文本框和一个组合框 因此,当发生以下任何事件时,应更新MySourceProperty:
- 文本框。文本更改
- ComboBox.SelectedItem更改
- 文本框聚焦
- 组合框聚焦
编辑:我用粗体写了这个问题,以明确我想要什么。我可以通过在代码隐藏中使用事件处理程序来解决这个问题,但我正在努力改变我的WinForms习惯。但是,如果这是唯一的解决方案,请随意回答。您可能希望将这些表示实体的控件放在单个数据模板或用户控件中。然后将该控件的datacontext绑定到组合框的选定项。绑定现在将相对于所选项目,并将自动更新。无需处理焦点或多个更新触发器。不确定这是否有助于Kilazur 如前所述,我会首先尝试一下,如果这不适合您的场景,那么我已经做了类似的事情
LostFocus
如果你真的像你说的那样:
我可以通过在代码隐藏中使用事件处理程序来解决这个问题,但我正在努力改变我的WinForms习惯
然后根据我的理解:您正在使用两个控件TextBox
和ComboBox
来更新单个属性MySourceProperty
。我的建议是,您应该使用双向绑定,或者您可以使用设置为true的ComboBox
和数据绑定ComboBox.Text
和ComboBox.Text来组合它们。使用myourceproperty
选择editem
编辑:如果确实需要按当前方式进行编辑,那么与其只使用一个属性,更好的方法是将
TextBox.Text
和ComboBox.SelectedItem
绑定到两个不同的属性。然后,您的MySourceProperty
应根据焦点状态返回其中一个属性。您目前面临的问题是什么(而MySourceProperty
在TextBox
或ComboBox
聚焦时不会更新)?不,不,它会更新。我希望当我的文本框变得集中时,它也会得到更新。如果它没有被更改,为什么你需要更新它?我在问题的第二部分解释了它(我想)。当我的组合框的所选项目发生更改时,MySourceProperty会得到更新,酷;但是现在,当我聚焦文本框时,它的值仍然是ComboBox。选择EdItem直到我更改它的文本值,当我希望它成为TextBox时。Text自动。好的,看起来你做得不对,为什么需要一个文本框
和一个ComboBox
?您只需使用一个设置为true的组合框
,然后数据绑定组合框。文本
和组合框。使用myourceproperty
选择editem
。这不是更直观吗?这确实是我想到的第一件事。我同意Kilazur,虽然我们想避免代码隐藏的习惯,但有一些设计限制导致我们依赖它们:)。文本框呢?我是WPF新手,很难看到它是如何工作的。正如我所说的:将所有应该随选择而更改的控件放在用户控件中。它们的绑定将与UserControlDataContext相关,正如我在评论中告诉您的,这个问题并没有涉及我的设计选择。信不信由你,我需要这两个控件。@Kilazur,编辑了我的答案。我不是以任何方式问你,只是提出建议,即使你不喜欢,也会有其他人觉得这个答案很有用。
<TextBox.Text>
<Binding Path="MySourceProperty"
Mode="OneWayToSource"
UpdateSourceTrigger="PropertyChanged" />
</TextBox.Text>
// itemNameTextBox is an instance of a TextBox
BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();