15

各タブとそのコンテンツがObservableCollectionにデータバインドされているTabControlがあります。

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

タブ1をクリックしてから、テキストボックスに何かを入力してタブを押すと、テキストボックスのフォーカスが失われ、テキストボックスに入力した新しいデータがObservableCollectionアイテムにコミットされます。

ただし、TestBoxにデータを入力し、すぐに別のタブをクリックすると、データがコミットされません。さらに、データに戻ると、入力したデータに設定されていません。

現在のタブが変更される前にデータを強制的にコミットする方法を知っている人はいますか?

更新と修正

私がしたことは、SelectionChangedイベントを配線することでした:

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

TabControlでFocus()を呼び出すと、TextBoxはフォーカスを失い、データをコミットします。これを行ったのは、同様の動作を示す他のコントロール(DatePickerなど)があるためです。これは一種のキャッチオールです。

4

4 に答える 4

15

この問題については、ここで詳しく説明しています。WPFバインディング:UpdateSourceTriggerとしてLostFocusの代わりにLostKeyboardFocusを使用する Microsoftの担当者がこの問題について数年間知っているが、まだ修正されていないことは非常に興味深いことです。また、ここで大きな議論があります:保存する前のWPFデータバインド

このハックは機能します:

    <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

新しいタブを選択すると、古いタブがビジュアルツリーからアンロードされます。それが変更がコミットされない理由だと思います。この動作を停止するか、回避策としてUpdateSourceTriggerPropertyChanged次のように設定できます。

<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 に答える