TabControl теряет выбранную вкладку в Window.Show

У нас есть решение MVVM (Cinch), в котором есть окно с TabControl. ItemsSource привязан к CollectionView (DefaultView, сгенерированному из ObservableCollection), с IsSynchronizedWithCurrentItem=true. Все отлично работает при первой загрузке окна... вкладки отображаются правильно, и пользователь может переключаться между ними.

Проблема возникает, когда окно скрыто и снова отображается. Первая вкладка всегда выбирается снова, независимо от того, что такое CurrentItem в CollectionView. Строка перед .Show содержит CurrentItem в качестве нужной нам вкладки, но вкладка переключается во время операции .Show.

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


person ZF.    schedule 02.02.2012    source источник
comment
Я только что проверил это с демонстрационным проектом, и я не могу воспроизвести это. dl.dropbox.com/u/18919663/mvvmbug.png 2 кнопки, 1 скрывает, 1 показывает окно, окно имеет вкладку, вкладка остается неизменной между скрытием и отображением. Он будет сброшен, если вы повторно инициализируете второе окно при каждом вызове. (т.е. Windows2 myWin = новое окно2(); myWin.Show();)   -  person corylulu    schedule 03.02.2012
comment
Если вы просто вызываете .Show и .Hide, я не понимаю, почему вы видите проблему, если вы создаете новый экземпляр для каждого шоу, тогда это ваша проблема.   -  person corylulu    schedule 03.02.2012
comment
Окно и его виртуальная машина сохраняются на протяжении всего жизненного цикла приложения, поэтому я думаю, что это связано с инфраструктурой MEFedMVVM/Cinch.   -  person ZF.    schedule 03.02.2012
comment
После еще нескольких тестов я обнаружил, что проблема заключалась в сохранении фокуса на вкладке, когда окно было закрыто. Чтобы исправить это, я устанавливал фокус на элемент управления за пределами элемента управления вкладкой всякий раз, когда выбранная вкладка изменялась.   -  person ZF.    schedule 08.02.2012


Ответы (1)


Это определенно взлом. Но вы можете переопределить событие Activated и сохранить индекс вкладки до того, как он будет сброшен, и установить его снова, когда он снова активируется.

protected override void OnActivated(EventArgs e)
{
    int tabControlIndex = myTabController.SelectedIndex;
    base.OnActivated(e);
    myTabController.SelectedIndex = tabControlIndex ;
}
person corylulu    schedule 02.02.2012