WPF中的EndEdit等价物

时间:2009-05-20 14:36:34

标签: c# .net wpf data-binding textbox

我有一个包含TextBox的WPF窗口。我已经实现了一个在Crtl-S上执行的Command,它保存了窗口的内容。我的问题是,如果文本框是活动控件,并且我在文本框中有新编辑的文本,则不会提交文本框中的最新更改。我需要从文本框中跳出来获取更改。

在WinForms中,我通常会在表单上调用EndEdit,并且所有挂起的更改都会被提交。另一种方法是使用onPropertyChange绑定而不是onValidation,但我宁愿不这样做。

什么是相当于EndEdit的WPF,或者在这种情况下使用的模式是什么?

谢谢,

6 个答案:

答案 0 :(得分:6)

根据Pwninstein的回答,我现在在WPF Views / Windows的公共类中实现了一个EndEdit,它将寻找绑定并强制对它们进行更新,代码如下;

以下代码;

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);
}

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

答案 1 :(得分:5)

您可以使用以下代码强制更新特定绑定:

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

更普遍地这样做是很困难的,因为没有通用的方法来获取所有绑定,也不一定要全部更新它们。

答案 2 :(得分:4)

为了避免需要标签的问题,您只需更改控件绑定的UpdateSourceTrigger属性即可。请尝试以下方法:

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

这告诉WPF每当Text属性发生更改时都会更新后备对象。这样,您就不必担心标签了。希望这有帮助!

修改

以下SO问题的已接受答案提供了一种自动运行页面验证规则的方法。您可以修改它以在所有BindingExpression对象上调用UpdateSource()。

<强> Link

答案 3 :(得分:3)

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

如果您有一些注册控件的机制,那么您可以显式强制数据绑定在WinForms应用程序中调用EndEdit的同一位置更新源代码。它不是整洁或优雅,但它完成了工作。

如果有人提出了更好的解决方案,我也会全力以赴。

答案 4 :(得分:1)

HI, 好吧,在使用WPF时,需要采用不同的思维模式。

我基本上将TextBox的Text属性绑定到我的一个属性(Model,ViewModel,Code-Behind,无论什么让你开心)。 因此,当您处理CTRL + S时,您只需转到绑定的clr属性,并继续使用您想要的所有数据。

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

答案 5 :(得分:1)

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

<Window.BindingGroup>
    <BindingGroup />
</Window.BindingGroup>

this.BindingGroup.CommitEdit();