Я создаю приложение WPF с использованием инфраструктуры MVVM, и я принял несколько функций из статьи Джоша Смита о MVVM здесь ...
Самое главное, я связываю TabControl с ObservableCollection ViewModels. Это означает, что я использую интерфейс MDI с вкладками, который отображает UserControl в качестве содержимого TabItem. Проблема, с которой я сталкиваюсь в своем приложении, заключается в том, что когда у меня есть несколько вкладок и я переключаюсь между вкладками, контент передается каждый раз, когда я меняю вкладки.
Если вы загрузите исходный код Джоша Смита, вы увидите, что у его приложения такая же проблема. Например, нажмите кнопку «Просмотреть всех клиентов» и прокрутите вниз до конца ListView. Затем нажмите кнопку «Создать нового клиента». Когда вы вернетесь к представлению «Все клиенты», вы заметите, что ListView прокручивается назад к началу. Если вы переключитесь обратно на вкладку «Новый клиент» и поместите курсор в один из текстовых полей, затем переключитесь на вкладку «Все клиенты» и вернитесь, и вы заметите, что курсор теперь исчез.
Я предполагаю, что это потому, что я использую ObservableCollection, но я не уверен. Есть ли способ предотвратить обновление содержимого вкладки при получении фокуса?
EDIT:
Я обнаружил свою проблему, когда запустил в своем приложении профилировщик. Я определяю DataTemplate для моих ViewModels, чтобы он знал, как визуализировать ViewModel, когда он отображается на вкладке ... примерно так:
<DataTemplate DataType="{x:Type vm:CustomerViewModel}">
<vw:CustomerView/>
</DataTemplate>
Поэтому, когда я переключаюсь на другую вкладку, она должна заново создавать ViewModel. Я временно исправил это, изменив мою ObservableCollection ViewModels на ObservableCollection of UserControls. Тем не менее, я действительно хотел бы использовать DataTemplates, если это возможно. Есть ли способ заставить DataTemplate работать?