1

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

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

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

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

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

4

2 回答 2

1

这与@AkselK 的回答不同,但我发现使用该Keyboard.FocusedElement属性的键盘聚焦控件并根据它是 a 、 还是 . 更新正确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 的绑定。

于 2013-11-08T21:08:07.827 回答
0

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

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

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

于 2012-02-10T10:27:16.540 回答