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