我有一个带有主窗口的程序,用户可以在其中更改数据。该程序还有一个待办事项对话框,用户可以在其中看到要执行的操作列表 - 此对话框具有自己的datacontext(与数据库的连接),但需要显示更新的数据。
我没有在主窗口的所有字段中将UpdateSourceTrigger设置为PropertyChanged(由于主窗口中的功能,无论如何都不需要这样做。)
但我需要主窗口在“活动”字段上执行更新源,以防用户激活待办事项对话框,以便可以将数据保存到数据库并在待办事项中重新读取对话框。
如果窗口上有“Deactivating”事件,我可以使用它简单地将焦点设置为其他东西(强制当前聚焦的控件以更新它的源)。但是没有Deactivating事件存在,只有在事后发生的Deactivated。在停用的主窗口中设置焦点会激活待执行对话框的激活。另外,我不能在待办事项Actived事件中执行此操作。激活事件会有所帮助 - 但这不存在。
任何好的想法如何强制更新源在我的主窗口之前待执行对话框被激活(通过选项卡或用鼠标点击它)?
答案 0 :(得分:1)
这种关于@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的绑定。
答案 1 :(得分:0)
您无需将Focus设置为其他元素即可更新绑定。相反,您可以使用GetBindingExpression方法:
valueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
这可能在Deactivating事件中有效。