TabControl губи избран раздел на Window.Show

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

Проблемът възниква, когато прозорецът е скрит и показан отново. Първият раздел винаги се избира отново, независимо какъв е 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 = нов Window2(); 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