2015-11-05 2 views
1

У меня есть TextBox в TabControl. Если я отредактирую текст в поле и перейду на другую вкладку, текст будет потерян. Если я изменю фокус (с помощью клавиши TAB на клавиатуре), а затем переключитесь на другую вкладку, новый текст будет установлен в моей модели просмотра.TextBox Binding не работает при переключении Tab в TabControl

Вот мой код:

<Window x:Class="TabSwitchProblem.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<TabControl ItemsSource="{Binding Pages}"> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding PageContent}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

public partial class MainWindow : Window 
{ 
    public ObservableCollection<PageViewModel> Pages 
    { 
     get { return (ObservableCollection<PageViewModel>)GetValue(PagesProperty); } 
     set { SetValue(PagesProperty, value); } 
    } 
    public static readonly DependencyProperty PagesProperty = 
     DependencyProperty.Register("Pages", typeof(ObservableCollection<PageViewModel>), typeof(MainWindow), new PropertyMetadata(null)); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Pages = new ObservableCollection<PageViewModel>(); 
     Pages.Add(new PageViewModel()); 
     Pages.Add(new PageViewModel()); 
     DataContext = this; 
    } 
} 
public class PageViewModel : DependencyObject 
{ 
    public string PageContent 
    { 
     get { return (string)GetValue(PageContentProperty); } 
     set { SetValue(PageContentProperty, value); } 
    } 
    public static readonly DependencyProperty PageContentProperty = 
     DependencyProperty.Register("PageContent", typeof(string), typeof(PageViewModel), new PropertyMetadata(null)); 
} 

Как я могу быть уверен, чтобы получить текст обновлен в моем ViewModel?

+0

Поймать указатель вкладки изменен и сообщить об их свойствах модели? – grmbl

+0

Я знаю, как поймать событие SelectionChanged. Но что вы имеете в виду, уведомив мою модель? Как я могу получить значение в TextBox и установить его в моей модели? – MTR

ответ

0

Возможно, вам потребуется добавить UpdateSourceTrigger=LostFocus в линию <TextBox Text="{Binding PageContent}" />.

код должен выглядеть следующим образом

<TextBox Text="{Binding PageContent, UpdateSourceTrigger=LostFocus}" /> 

Это должно работать.

+0

Нет, это не помогает. – MTR

+0

К сожалению, это должно было быть PropertyChanged, а не LostFocus. Я скопировал код из того, что я сделал. – AndrewJE

1

Вы должны установить UpdateSourceTrigger в PropertyChanged, если вы хотите, чтобы ваша привязка обновляла цель каждый раз при изменении значения. По умолчанию UpdateSourceTrigger для объекта Text объекта TextBox - LostFocus, который обновляет цель только после усечения фокуса.

<TextBox Text="{Binding PageContent, UpdateSourceTrigger=PropertyChanged}" /> 
+0

Это работает. Но у него есть побочный эффект, который он вызывает с каждым нажатием клавиши. – MTR

+0

Это ожидаемое поведение 'PropertyChanged', а не побочный эффект. –

+0

Я понимаю это, но я искал способ обновить свое свойство, когда пользователь нажимает на другую вкладку. Я не хочу обновлять с каждым нажатием клавиши. Поэтому для моей проблемы это обходное решение с побочным эффектом. Но в этом специальном случае это побочный эффект, который я могу принять. – MTR

Смежные вопросы