在停用窗口之前更新活动字段上的UpdateSource



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

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

但我需要主窗口对"活动"字段进行更新,以防用户激活待办事项对话框,从而将数据保存到数据库中,并在待办事项对话框中重新读取。

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

在待办事项对话框被激活之前(通过选项卡或用鼠标单击它),如何在我的主窗口上强制执行updatesource有什么好主意吗?

这与@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的绑定。

您不需要将Focus设置为其他元素来更新绑定。相反,您可以使用GetBindingExpression方法:

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

这可能在"停用"事件中起作用。

相关内容

  • 没有找到相关文章

最新更新