我有一个TabControl,其中每个Tab及其内容都被数据绑定到ObservableCollection:
<TabControl ItemsSource="{Binding Path=.}">
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=propertyValue}" />
</DataTemplate>
</TabControl>
</TabControl>
如果我单击选项卡1,然后在文本框中键入内容并按Tab键以使TextBox失去焦点,我键入文本框的新数据将提交给ObservableCollection项。
但是,如果我在TestBox中键入数据然后立即单击另一个选项卡,则永远不会提交数据。另外,当我回到数据时,它不再设置为我输入的内容。
任何人都知道在更改当前标签之前强制提交数据的方法吗?
更新&amp; FIX
我所做的是连接SelectionChanged
事件:
private void tabData_SelectionChanged(object sender, SelectionChangedEventArgs e) {
theTabControl.Focus();
}
在TabControl上调用Focus()会使TextBox失去焦点并提交数据。我这样做是因为我有其他控件 - 比如DatePicker - 它们表现出类似的行为。这是一个很好的选择。
答案 0 :(得分:12)
这个问题在这里有详细描述:WPF Binding: Use LostKeyboardFocus instead of LostFocus as UpdateSourceTrigger非常有趣的是,微软的人多年来都知道这个问题,但仍未修复。 这里也是一个很大的讨论:WPF Databind Before Saving
这个黑客有效:
<TabControl SelectionChanged="OnSelectionChanged">
代码隐藏:
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (Keyboard.FocusedElement is TextBox)
Keyboard.FocusedElement.RaiseEvent(new RoutedEventArgs(LostFocusEvent));
}
答案 1 :(得分:2)
如果选择新选项卡,旧选项卡将从可视树中卸载。我认为这就是为什么不提交更改的原因。您可以尝试stop this behaviour或作为解决方法将UpdateSourceTrigger设置为PropertyChanged
:
<TextBox Text="{Binding Path=propertyValue, UpdateSourceTrigger="PropertyChanged"}" />
答案 2 :(得分:0)
如果您有其他控件或从文本框转换为制表符控件的方式,这可能是最佳答案。如果文本框以任何方式失去键盘焦点,它将升级为失去焦点。
public static class StringExtensions
{
public static TEnum ToEnum<TEnum>(this string text)
where TEnum : struct, IComparable, IFormattable, IConvertible
{
TEnum result = default(TEnum);
return !string.IsNullOrWhiteSpace(text)
&& Enum.TryParse(text, true, out result)
&& Enum.IsDefined(typeof(TEnum), result.ToString())
? result
: default(TEnum);
}
}
并且在代码隐藏中的事件处理程序中: -
<TextBox PreviewLostKeyboardFocus="commentTextBox_PreviewLostKeyboardFocus" Name="commentTextBox" Text="{Binding Comment, UpdateSourceTrigger=LostFocus}"/>
这样可以升级“失去的键盘焦点”&#39;一个完全成熟的失去焦点&#39;预览阶段的活动。
答案 3 :(得分:-1)
也许你可以试试这个
<TabControl ItemsSource="{Binding Path=.}">
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=propertyValue,UpdateSourceTrigger=LostFocus}" />
</DataTemplate>
</TabControl>