我有一个带有主窗口的程序,用户可以在其中更改数据。该程序还有一个待办事项对话框,用户可以在其中看到要做的事情的列表,该对话框有自己的数据上下文(与数据库的连接),但需要显示let更新的数据。
我没有将主窗口中所有字段中的UpdateSourceTrigger设置为PropertyChanged(由于主窗口中的功能,在所有情况下都不需要这样做)。
但我需要主窗口对"活动"字段进行更新,以防用户激活待办事项对话框,从而将数据保存到数据库中,并在待办事项对话框中重新读取。
如果窗口上有"停用"事件,我可以使用它来简单地将焦点设置为其他内容(强制当前集中的控件更新其源)。但不存在Deactiving事件,只有Deactivated事件发生在事件发生之后。在停用的主窗口中设置焦点会打乱待办事项对话框的激活。此外,我不能在to do dialogs Actived事件中执行此操作。激活事件会有所帮助,但这并不存在。
在待办事项对话框被激活之前(通过选项卡或用鼠标单击它),如何在我的主窗口上强制执行updatesource有什么好主意吗?
这与@AkselK的答案不一样,但我使用Keyboard.FocusedElement
属性找到了以键盘为中心的控件,并根据它是TextBox
、Selector
还是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();
这可能在"停用"事件中起作用。