【问题标题】:Force WPF to Commit Changes on Focused Element强制 WPF 提交对焦点元素的更改
【发布时间】:2010-04-15 13:46:46
【问题描述】:

我正在使用 VS2010、WPF 和 EF。通过将实体拖出数据源工具窗口,我在窗口上放置了控件。我使用了“详细信息”设置,因此我的实体由多个标签和文本框表示。我还添加了一个带有以下代码的按钮:

_context.SaveChanges();

当我编辑数据时,无论哪个文本框具有焦点,都不会将更改提交回数据库。其他一切都很好。如果我在点击保存按钮之前将焦点转移到另一个元素,它也会提交。我在使用 DataGrid 时也经历过同样的事情。

我知道我遗漏了一些简单的东西,但我可以弄清楚。关于我缺少什么的任何想法?

谢谢!

【问题讨论】:

    标签: wpf entity-framework data-binding visual-studio-2010 commit


    【解决方案1】:

    这是因为TextBox 的默认Binding UpdateSourceTrigger 是LostFocus。如果您修改所有绑定以将其设置为 PropertyChanged,它将像您期望的那样工作:

    <TextBox Text="{Binding SomeProperty, UpdateSourceTrigger=PropertyChanged}" />
    

    【讨论】:

    • 为什么单击按钮时TextBox不会“失去焦点”?您可以以编程方式强制执行此操作吗?
    • 有人能回答 Rob Fonseca-Ensor 的问题吗?
    • 单击按钮时确实会失去焦点。不幸的是,它是在单击按钮并执行其命令/单击处理程序之后。效果是在按钮的操作执行之后绑定才会更新。如果需要,您可以获取 BindingExpression 并强制它在执行按钮的操作之前更新源。不过一般来说,设置 UpdateSourceTrigger 是最简单的方法。
    • 如果您的属性没有实现 IPropertyChanged,这将不起作用。
    • WPF 很乐意对未实现该接口的类的属性进行双向绑定。您的类的属性将由 TextBox 设置。如果属性是在代码中设置的,您将看不到 UI 的更改,或者如果多个元素绑定到同一个属性并且其中一个发生更改,则您不会看到其他 UI 元素。这篇 MSDN 文章提供了更多详细信息:msdn.microsoft.com/en-us/library/ms743643.aspx
    【解决方案2】:

    我在尝试以编程方式设置数据绑定文本框的值时遇到了同样的问题,但 Abe 的建议对我们的设置不起作用(它导致了一些不稳定的验证行为)。

    这是我如何让它工作的:

    TextBox tb = (TextBox)this.FindName("TargetTextBox");
    tb.Text = "1234";
    tb.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多