WPF:数据绑定TabControl在选择新选项卡时不提交更改

时间:2012-04-18 11:56:54

标签: wpf c#-4.0

我有一个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 - 它们表现出类似的行为。这是一个很好的选择。

4 个答案:

答案 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>