我有一个TabControl,其中每个Tab及其内容都数据绑定到ObservableCollection:
<TabControl ItemsSource="{Binding Path=.}">
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=propertyValue}" />
</DataTemplate>
</TabControl>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
如果我单击选项卡1,然后在文本框中键入内容并单击选项卡以使TextBox失去焦点,我键入文本框的新数据将提交给ObservableCollection项.
但是,如果我在TestBox中键入数据然后立即单击另一个选项卡,则永远不会提交数据.另外,当我回到数据时,它不再设置为我输入的内容.
任何人都知道在更改当前选项卡之前强制提交数据的方法吗?
更新和修复
我做了什么是连接SelectionChanged
事件:
private void tabData_SelectionChanged(object sender, SelectionChangedEventArgs e) {
theTabControl.Focus();
}
Run Code Online (Sandbox Code Playgroud)
在TabControl上调用Focus()会使TextBox失去焦点并提交数据.我这样做是因为我有其他控件 - 比如DatePicker - 它们表现出类似的行为.这是一个很好的选择.
ask*_*msk 13
这个问题在这里得到了很好的描述:WPF绑定:使用LostKeyboardFocus而不是LostFocus作为UpdateSourceTrigger 非常有趣的是看到微软的人已经知道这个问题多年但仍然没有修复它.这里也是一个很大的讨论:WPF Databind在保存之前
这个黑客有效:
<TabControl SelectionChanged="OnSelectionChanged">
Run Code Online (Sandbox Code Playgroud)
和代码隐藏:
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (Keyboard.FocusedElement is TextBox)
Keyboard.FocusedElement.RaiseEvent(new RoutedEventArgs(LostFocusEvent));
}
Run Code Online (Sandbox Code Playgroud)