代码之家  ›  专栏  ›  技术社区  ›  Thies

WPF中的Endedit等价物

  •  6
  • Thies  · 技术社区  · 15 年前

    我有一个包含文本框的wpf窗口。我实现了一个在crtl-s上执行的命令,它保存了窗口的内容。我的问题是,如果文本框是活动控件,并且我在文本框中新编辑了文本,则不会提交文本框中的最新更改。我需要从文本框中退出以获取更改。

    在winforms中,我通常会在表单上调用endedit,所有挂起的更改都将提交。另一种方法是使用onpropertychange绑定,而不是onvalidation,但我不希望这样做。

    什么是wpf等价于endedit,或者在这种类型的场景中使用什么模式?

    谢谢,

    6 回复  |  直到 9 年前
        1
  •  4
  •   Community vonPryz    7 年前

    为了避免需要使用制表符,只需更改控件绑定的updatesourcetrigger属性。请尝试以下操作:

    <TextBox.Text>
        <Binding Path="MyProperty" UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
    

    这告诉wpf在文本属性更改时更新备份对象。这样的话,你就不必担心躲开了。希望这有帮助!

    编辑:

    以下so问题的公认答案提供了一种自动运行页面验证规则的方法。您可以修改它,改为对所有bindingExpression对象调用updateSource()。

    Link

        2
  •  6
  •   Mark Avenius    9 年前

    根据pwninstein的回答,我现在已经实现了 EndEdit 在我的wpf视图/windows公共类中,它将查找绑定并强制对其进行更新,代码如下;

    下面的代码;

    private void EndEdit(DependencyObject parent)
    {
        LocalValueEnumerator localValues = parent.GetLocalValueEnumerator();
        while (localValues.MoveNext())
        {
            LocalValueEntry entry = localValues.Current;
            if (BindingOperations.IsDataBound(parent, entry.Property))
            {
                BindingExpression binding = BindingOperations.GetBindingExpression(parent, entry.Property);
                if (binding != null)
                {
                    binding.UpdateSource();
                }
            }
        }            
    
        for(int i=0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(parent, i);
            this.EndEdit(child);
        }
    }
    
    protected void EndEdit()
    {
        this.EndEdit(this);
    }
    

    在我的save命令中,我现在只需调用 恩迪斯 方法,我不必担心其他程序员选择绑定方法。

        3
  •  5
  •   David Nelson    15 年前

    可以使用特定的代码强制更新特定绑定,如下所示:

    var bindingExpression = txtInput.GetBindingExpression(TextBox.TextProperty);
    bindingExpression.UpdateSource();
    

    更普遍地说,这样做是困难的,因为没有获得所有绑定的通用方法,也不一定要更新所有绑定。

        4
  •  3
  •   micahtan    15 年前

    我不同意w/arielbh。这里的问题是键盘和逻辑焦点之间的相互作用,除非您已将所有数据绑定更新触发器更改为propertyChanged,否则在某些情况下(例如,单击工具栏按钮)可能会错过一些源数据更新。例如,textbox.text的默认更新触发器是lostFocus,单击工具栏按钮不会模糊活动的textbox焦点。

    如果您有一些机制来注册控件,那么可以显式地强制数据绑定在winforms应用程序中调用endedit的同一位置更新源。它不整洁也不优雅,但它能完成任务。

    如果有人想出更好的解决办法,我也会全神贯注。

        5
  •  1
  •   ArielBH    15 年前

    你好, 好吧,在使用wpf时,我们需要采用不同的思维方式。

    我基本上会将textbox的文本属性绑定到我的一个属性(model、viewmodel、codebhind,任何让你高兴的东西)。 因此,当处理ctrl+s时,只需转到已绑定的clr属性,然后愉快地继续处理所需的所有数据。

    希望对您有所帮助,如果您需要代码示例,请给我留言。 羚羊

        6
  •  1
  •   dalchri    14 年前

    我相信您应该声明一个绑定组,然后在代码中引用该绑定组。我把我的放在根窗口元素上,这样它就得到了窗口上所有控件的绑定。

    <Window.BindingGroup>
        <BindingGroup />
    </Window.BindingGroup>
    
    this.BindingGroup.CommitEdit();