15

我有一个 TabControl,其中每个 Tab 及其内容都数据绑定到 ObservableCollection:

<TabControl ItemsSource="{Binding Path=.}">
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=propertyValue}" />
        </DataTemplate>
    </TabControl>
</TabControl>

如果我要单击 Tab 1,然后在文本框中键入一些内容并单击选项卡,以便 TextBox 失去焦点,我在文本框中键入的新数据将被提交到 ObservableCollection 项。

但是,如果我在 TestBox 中键入数据,然后立即单击另一个选项卡,则永远不会提交数据。另外,当我返回数据时,它不再设置为我输入的内容。

任何人都知道在更改当前选项卡之前强制数据提交的方法吗?

更新和修复

我所做的是连接SelectionChanged事件:

private void tabData_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    theTabControl.Focus();         
}

在 TabControl 上调用 Focus() 会使 TextBox 失去焦点并提交数据。我这样做是因为我有其他控件(例如 DatePicker),它们表现出类似的行为。这是一个包罗万象的东西。

4

4 回答 4

15

这个问题在这里得到了很好的描述:WPF Binding: Use LostKeyboardFocus 而不是 LostFocus 作为 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));
    }
于 2012-04-18T12:31:19.353 回答
2

如果您选择一个新选项卡,旧选项卡将从可视树中卸载。我认为这就是未提交更改的原因。您可以尝试停止这种行为,或者作为一种解决方法,您可以将UpdateSourceTrigger设置为PropertyChanged

<TextBox Text="{Binding Path=propertyValue, UpdateSourceTrigger="PropertyChanged"}" />
于 2012-04-18T12:20:49.803 回答
1

如果除了选项卡控件之外,您还有其他控件或从文本框转换的方式,这可能是最简洁的答案。如果文本框以任何方式失去键盘焦点,它将升级为失去焦点。

<TextBox PreviewLostKeyboardFocus="commentTextBox_PreviewLostKeyboardFocus"  Name="commentTextBox" Text="{Binding Comment, UpdateSourceTrigger=LostFocus}"/>

并在代码隐藏的事件处理程序中:-

    private void commentTextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        (sender as TextBox).RaiseEvent(new RoutedEventArgs(LostFocusEvent));
    }

这具有在预览阶段将“失去键盘焦点”升级为完全成熟的“失去焦点”事件的效果。

于 2017-10-05T14:59:59.623 回答
-1

也许你可以试试这个

<TabControl ItemsSource="{Binding Path=.}">
<TabControl.ContentTemplate>
    <DataTemplate>
        <TextBox Text="{Binding Path=propertyValue,UpdateSourceTrigger=LostFocus}" />
    </DataTemplate>
</TabControl>

于 2012-04-18T12:22:55.300 回答