Я - вновь прибывший к WPF, пытаясь разработать проект, который следует рекомендациям превосходной статьи Josh Smith, описывающей Шаблон разработки Model-View-ViewModel.
С помощью кода кода Josh's как основы я создал простое приложение, которое содержит много "рабочих областей", каждый представленный вкладкой в TabControl. В моем приложении рабочая область является редактором документа, который позволяет иерархическому документу управляться через управление TreeView.
Хотя я преуспел в том, чтобы открыть несколько рабочих областей и просмотреть их содержание документа в связанном управлении TreeView, я нахожу, что TreeView "забывает" свое состояние при переключении между вкладками. Например, если TreeView в Tab1 будет частично расширен, то его покажут, как полностью свернуто после переключения на Tab2 и возврата Tab1. Это поведение, кажется, относится ко всем аспектам состояния управления для всех средств управления.
После некоторого экспериментирования я понял, что могу сохранить состояние в TabItem путем явной привязки каждой государственной собственности управления со специализированным свойством на базовом ViewModel. Однако это походит на большую дополнительную работу, когда я просто хочу, чтобы все мои средства управления помнили свое состояние при переключении между рабочими областями.
Я предполагаю, что пропускаю что-то простое, но я не уверен, где искать ответ. Любое руководство очень ценилось бы.
Спасибо, Tim
Обновление:
Согласно просьбе я попытаюсь отправить некоторый код, который демонстрирует эту проблему. Однако, так как данные, которые лежат в основе TreeView, сложны, я отправлю упрощенный пример, который показывает те же признаки. Вот XAML из главного окна:
XAML вышеупомянутого правильно связывает с ObservableCollection DocumentViewModel, посредством чего каждый участник представлен через DocumentView.
Для простоты этого примера я удалил TreeView (упомянутый выше) из DocumentView, и заменил его TabControl, содержащим 3 фиксированных вкладки:
В этом сценарии нет никакой привязки между DocumentView и DocumentViewModel. Когда код выполняется, внутренний TabControl не может помнить свой выбор, когда внешний TabControl переключается.
Однако, если я явно связываю свойство SelectedIndex внутреннего TabControl...
... к соответствующему фиктивному свойству на DocumentViewModel...
public int SelecteDocumentIndex { get; set; }
... внутренняя вкладка может помнить свой выбор.
Я понимаю, что могу эффективно решить свою проблему путем применения этой техники к каждому визуальному свойству каждого управления, но я надеюсь, что существует более изящное решение.
Применение применения писателя Framework WPF (WAF) показывает, как решить вашу проблему. Это создает новый Usercontrol для каждого табо. Таким образом, состояние сохраняется, когда пользователь меняет активную вкладку.