C# 一个控件的多个UpdateSourceRigger

C# 一个控件的多个UpdateSourceRigger,c#,wpf,updatesourcetrigger,C#,Wpf,Updatesourcetrigger,简单的问题,假设我有这个文本框(事实上,我有): 每当MySourceProperty的文本属性发生更改时,它将成功地更新MySourceProperty。除此之外,我还想在文本框聚焦时更新MySourceProperty 有没有办法让一个控件有两个UpdateSourceRigger? 关于详细信息,我有一个父视图,其中包含一个绑定到MySourceProperty的标签,还有一个视图,其中包含一个文本框和一个组合框 因此,当发生以下任何事件时,应更新MySourceProperty:

简单的问题,假设我有这个文本框(事实上,我有):


每当MySourceProperty的文本属性发生更改时,它将成功地更新MySourceProperty。除此之外,我还想在文本框聚焦时更新MySourceProperty

有没有办法让一个控件有两个UpdateSourceRigger?


关于详细信息,我有一个父视图,其中包含一个绑定到MySourceProperty的标签,还有一个视图,其中包含一个文本框和一个组合框

因此,当发生以下任何事件时,应更新MySourceProperty:

  • 文本框。文本更改
  • ComboBox.SelectedItem更改
  • 文本框聚焦
  • 组合框聚焦
最后两个事件显然在这里,因为将焦点赋予控件不会更改其文本或SelectedItem属性,因此也不会更新MySourceProperty



编辑:我用粗体写了这个问题,以明确我想要什么。我可以通过在代码隐藏中使用事件处理程序来解决这个问题,但我正在努力改变我的WinForms习惯。但是,如果这是唯一的解决方案,请随意回答。

您可能希望将这些表示实体的控件放在单个数据模板或用户控件中。然后将该控件的datacontext绑定到组合框的选定项。绑定现在将相对于所选项目,并将自动更新。无需处理焦点或多个更新触发器。

不确定这是否有助于Kilazur

如前所述,我会首先尝试一下,如果这不适合您的场景,那么我已经做了类似的事情

  • 将UpdateSourceTrigger设置为Explicit
  • TextBox Name=“itemnamextbox”Text=“{Binding Path=ItemName, UpdateSourceTrigger=显式}”

  • 然后在代码隐藏中的相应事件中调用UpdateSource(您在上面提到过)

  • 引自

    有没有一种方法可以让一个控件有两个UpdateSourceTrigger

    你的问题的答案是否定的。即使它是有效的,另一个触发因素是
    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();