Вопрос по c#-4.0, wpf – WPF: связанный с данными TabControl не фиксирует изменения при выборе новой вкладки

11

Я получил TabControl, где каждая вкладка и ее содержимое привязаны к ObservableCollection:

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

Если бы я щелкнул на вкладке 1, затем что-то набрал в текстовом поле и нажал на вкладку, чтобы TextBox потерял фокус, новые данные, которые я набрал в текстовом поле, будут привязаны к элементу ObservableCollection.

Однако, если я введу данные в TestBox и сразу же нажму на другую вкладку, данные никогда не будут зафиксированы. Кроме того, когда я возвращаюсь к данным, они больше не соответствуют тому, что я набрал.

Кто-нибудь знает способ заставить данные зафиксироваться до изменения текущей вкладки?

UPDATE & FIX

То, что я сделал, было связаноSelectionChanged событие:

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

Вызов Focus () для TabControl заставляет TextBox терять фокус и фиксировать данные. Я сделал это, потому что у меня есть другие элементы управления, такие как DatePicker, которые демонстрируют аналогичное поведение. Это своего рода ловушка для всех.

@ asktomsk Вы правы, он фиксирует, когда фокус потерян. Однако при выборе новой вкладки фокус не теряется (или событие не срабатывает bugfixr
Огромное спасибо. Это спасло меня после 5 часов поиска -TabControl.Focus() спас мою задницу. Хорошее редактирование Mafii
Это должно быть сделано на потерянном фокусе. Попробуйте добавить еще один TextBox в шаблон и переключиться на него. Это работает? asktomsk

Ваш Ответ

4   ответа
12

WPF Binding: используйте LostKeyboardFocus вместо LostFocus как UpdateSourceTrigger Очень интересно, что ребята из Microsoft знают об этой проблеме уже несколько лет, но до сих пор не решили ее. Также большое обсуждение здесь:WPF Databind перед сохранением

Этот хак работает:

    <TabControl SelectionChanged="OnSelectionChanged">

И код позади:

    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (Keyboard.FocusedElement is TextBox)
            Keyboard.FocusedElement.RaiseEvent(new RoutedEventArgs(LostFocusEvent));
    }
2

старая будет выгружена из визуального дерева. Я предполагаю, что поэтому изменение не зафиксировано. Вы могли бы попытаться останови это поведение или как обходной путь, который вы могли бы установить UpdateSourceTrigger вPropertyChanged:

<TextBox Text="{Binding Path=propertyValue, UpdateSourceTrigger="PropertyChanged"}" />
Это может сработать, хотя проблема в том, что я сохраняю данные при изменении ObservableCollection. Я предполагаю, что это будет означать, что каждое нажатие клавиши приведет к сохранению данных? bugfixr
Это действительно будет сохраняться при каждом нажатии клавиши. Или вы можете изменить его наUpdateSourceTrigger=Explicit и запусти обновление самостоятельно, когда захочешь, но я думаю, чтоPropertyChanged лучший вариант Jason Ridge
0

если у вас есть другие элементы управления или способы перехода из текстового поля, кроме элемента управления вкладкой. Если текстовое поле каким-либо образом теряет фокус клавиатуры, оно обновляется до потерянного фокуса.

<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));
    }

Это приводит к обновлению «потерянного фокуса клавиатуры» до полноценного события «потерянного фокуса» на этапе предварительного просмотра.

-1

Может быть, вы можете попробовать это

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

Это по умолчанию для текстовых полей. LPL
Спасибо - хотя проблема в том, что LostFocus не запускается при выборе новой вкладки. bugfixr

Похожие вопросы