2013-08-12 6 views
2

В моем приложении, у меня есть следующий TabControl:Странное поведение с двухсторонним Binding и TabControl

<TabControl ItemsSource="{Binding MyItemsSource}" 
      ContentTemplate="{StaticResource ResourceKey=MyContentTemplate}" 
      IsSynchronizedWithCurrentItem="True" /> 

Вот ContentTemplate используется:

<DataTemplate x:Key="MyContentTemplate"> 
    <Canvas> 
     <TextBox Text="{Binding Path=MyFirstText, Mode=TwoWay}" /> 
     <TextBox Text="{Binding Path=MySecondText, Mode=TwoWay}" /> 
    </Canvas> 
</DataTemplate> 

И в ItemsSource:

public ObservableCollection<MyData> MyItemsSource { get; set; } 

public class MyData 
{ 
    public string MyFirstText { get; set; } 
    public string MySecondText { get; set; } 
} 

Рассмотрите этот сценарий:

  • Выберите первую вкладку
  • Введите текст в первом TextBox
  • Выберите вторую вкладку
  • Выберите первую вкладку: Текст, введенный в TextBox на первой вкладке исчезала (поскольку связывание не было применяется)

Другой сценарий:

  • Выберите первую вкладку
  • Введите какой-нибудь текст в первом TextBox
  • Выберите второй TextBox (или что-то изменить фокус, за исключением вкладки изменения)
  • Выберите вторую вкладку
  • Выберите первую вкладку: текст, введенный по-прежнему отображается (потому что применялось связывание)

Это нормальное поведение? Или я делаю что-то неправильно? Спасибо.

+1

Вы отслеживали? Вызывается Set? Показать MyItemsSource. – Paparazzi

+0

Я отредактировал, чтобы добавить ItemsSource. –

ответ

1

Это может быть связано с целенаправленным элементом и OnLostFocus событии не срабатывает, когда переключение между вкладками. Попробуйте изменить привязки с атрибутом UpdateSourceTriger, как это:

<DataTemplate x:Key="MyContentTemplate"> 
    <Canvas> 
     <TextBox Text="{Binding Path=MyFirstText, UpdateSourceTrigger=PropertyChanged}" /> 
     <TextBox Text="{Binding Path=MySecondText, UpdateSourceTrigger=PropertyChanged}" /> 
    </Canvas> 
</DataTemplate> 

Кроме того, вам не нужно указывать режим TwoWay как в WPF это по умолчанию один.

0

Проблема в том, что LostFocus не запускается при изменении вкладок, вы можете изменить UpdateSourceTrigger на PropertyChanged, как ранее упоминалось, но я предпочел расширить TabControl и вручную запустить LostFocus. Таким образом, мне не нужно добавлять UpdateSourceTrigger = PropertyChanged в каждый TextBox в моей вкладке. Я также избегаю обновления режима просмотра при каждом нажатии клавиши.

Это производное от решения, упомянутого здесь. WPF: Data bound TabControl doesn't commit changes when new tab is selected

public class SmartTabControl : TabControl 
{ 
    protected override void OnSelectionChanged(SelectionChangedEventArgs e) 
    { 
     if (Keyboard.FocusedElement is TextBox) 
      Keyboard.FocusedElement.RaiseEvent(new RoutedEventArgs(LostFocusEvent)); 

     base.OnSelectionChanged(e); 
    } 
} 
Смежные вопросы