【问题标题】:UpdateSource on active field before deactivating window在停用窗口之前在活动字段上更新源
【发布时间】:2012-02-10 09:46:28
【问题描述】:

我有一个带有主窗口的程序,用户可以在其中更改数据。该程序还有一个待办事项对话框,用户可以在其中看到一个待办事项列表 - 这个对话框有它自己的数据上下文(连接到数据库),但需要显示更新的数据。

我没有在主窗口的所有字段中将 UpdateSourceTrigger 设置为 PropertyChanged(无论如何,由于主窗口中的功能,这在所有情况下都不需要)。

但我需要主窗口在“活动”字段上执行更新源,以防用户激活待办事项对话框,以便将数据保存到数据库并在待办事项中重新读取-对话框。

如果窗口上有一个“停用”事件,我可以使用它来简单地将焦点设置为其他东西(强制任何当前集中的控件更新它的源)。但是不存在 Deactivating 事件,只有事后发生的 Deactivating 事件。在停用的主窗口中设置焦点会打乱待办事项对话框的激活。此外,我不能在 to-do-dialogs Actived 事件中执行此操作。激活事件会有所帮助 - 但不存在。

有什么好主意如何在我的主窗口激活待办事项对话框之前强制更新源(通过标签或用鼠标单击它)?

【问题讨论】:

    标签: wpf events updatesourcetrigger


    【解决方案1】:

    这种方式与@AkselK 的答案不同,但我发现使用Keyboard.FocusedElement 属性的键盘聚焦控件并根据它是TextBoxSelector 还是ToggleButton 更新正确的绑定。我希望 Keyboard.FocusedElement 告诉我我正在切换到的窗口是有焦点的,但它实际上确实给了我在停用窗口内的控制权。

    void MyWindow_Deactivated(object sender, EventArgs e)
    {
        if(Keyboard.FocusedElement is TextBox)
        {
            (Keyboard.FocusedElement as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();
        }
        else if(Keyboard.FocusedElement is Selector)
        {
            (Keyboard.FocusedElement as Selector).GetBindingExpression(Selector.SelectedItemProperty).UpdateSource();
            //todo: should this also update SelectedValueProperty?
        }
        else if(Keyboard.FocusedElement is ToggleButton)
        {
            (Keyboard.FocusedElement as ToggleButton).GetBindingExpression(ToggleButton.IsCheckedProperty).UpdateSource();
        }
    }
    

    我不确定Selector 部分是否也应该更新SelectedValue 的绑定。

    【讨论】:

      【解决方案2】:

      您无需将 Focus 设置为不同的元素即可更新绑定。相反,您可以使用 GetBindingExpression 方法:

      valueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
      

      这可能在 Deactivating 事件中起作用。

      【讨论】:

      • 问题是我不知道窗口中的哪个字段可以被用户编辑。它可以是任何文本框、复选框、组合框等。并且没有 Deactivating 事件!
      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多