Всем привет!
Есть проект на WPF (.NET Framework 4.0), который разрабатывается по паттерну MVVM с использованием Caliburn Micro.
Есть окно, которое содержит вкладки, как минимум две. View-Model окна наследуется от Caliburn'овского Conductor<Screen>.Collection.OneActive. Каждый таб - отдельная вьюшка + вью-моделька.
Есть следующая задача: сделать так, чтобы после последнего поля первой вкладки нажатием Tab пользователь переходил к первому полю второй вкладки.
На .NET весьма недавно, может быть по этому о простом решении такой задачи не знаю. Пробовал играться с KeyboardNavigation, но заставить вкладки переключаться не удалось. Может плохо искал?
Поскольку аналогичная возможность предвидится еще в нескольких местах (да и просто из спортивного интереса), захотелось сделать более-менее универсальное решение. Решил написать Behavior для FrameworkElement'а, который принимает параметр вроде TargetControl (контрол, на который нужно перейти по нажатии Tab) и при, собственно, нажатии Tab будет производить все необходимые манипуляции, чтобы требуемый контрол стал доступен пользователю и получил фокус (активировал нужное окно, открывал вкладку... ну и все на данный момент).
Принцип работы следующий - рекурсивно вызываем функцию активации элемента для визуального родителя (начиная с родителя TargetControl и пока родитель не окажется null) и выполняем операции по активации этого элемента в соответствии с его типом (например, если это окно, то вызываем .Activate()).
Вот тут получается проблема с TabControl. У него в чайлдах нету какого-либо элемента, который содержал бы весь контент таба и который можно было бы как-нибудь активировать. И вообще, он всегда содержит только контент активного таба. Т.е. пройтись по всем табам, найти тот, который содержит требуемый элемент, и активировать его не представляется возможным.
Да и вообще, чтобы активировать таб, нужно изменить значение свойства SelectedItem на одно из значений коллекции Items, которая содержит вью-модели. Т.е. даже если найти нужный UI-элемент с нужным содержимым, необходимо как-то получить соответствующую ViewModel.
Есть какие-нибудь идеи?