Это действительно похоже на ошибку в WPF. Смотрите в этом коде:
http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/TabControl.cs,342
сначала он вызывает base.OnSelectionChanged
(что вызывает событие SelectionChanged
), затем пытается установить фокус на выбранный TabItem
(который также случайно не срабатывает, поскольку новый контент еще не отображается), и только затем вызывает UpdateSelectedContent
, который фактически устанавливает SelectedContent
в новое значение (содержимое новой вкладки).
Так что да, событие SelectionChanged
бесполезно. Хороший обходной путь - это подписка при изменении значения свойства зависимости SelectedContent
:
var dp = DependencyPropertyDescriptor.FromProperty(TabControl.SelectedContentProperty, typeof(TabControl));
dp.AddValueChanged(tabControl, OnTabControlSelectedContentChanged);
Если вы установите точку останова в OnTabControlSelectedContentChanged
, вы заметите, что она повышается после SelectionChanged
, и к этому времени содержимое должно быть обновлено. Не забудьте также установить фокус на новый контент вручную (поскольку попытка WPF установить фокус не удалась). Для установки фокуса, возможно, потребуется сделать Dispatcher.BeginInvoke
как обычно.