С wpf можно многому научиться, и подход mvvm сильно отличается от кода, управляемого событиями.
Ваша разметка выглядит так, будто вы сначала делаете viewmodel ... или что-то в этом роде.Если у вас есть экспозиции MainWindowViewModel, скажем, свойство SubVM.
Привязать SubVM к свойству содержимого элемента управления контентом в главном окне.Установите SubVM для экземпляра модели представления, такой как SettingsVM.Затем это оформляется на виде с использованием соответствующей таблицы данных.Вы видите Настройки V появляются.Текст данных Настройки V - это ваш SubVM.Свяжите элементы управления в SettingsV со свойствами в SubVM, и значения могут передаваться между ними.Это позволяет вам контролировать, когда вы создаете экземпляр SettingsVM в MainWindowViewModel.Поэтому вы «знаете», есть ли у вас экземпляр этого или нет.Вы можете кэшировать экземпляры моделей представления в словаре.Используйте тип в качестве ключа, и вы можете создать его, если у вас его нет в словаре, а затем использовать его повторно, если вы хотите сохранить состояние.
Вы можете настроить MainWindow для создания экземпляра MainWindowViewModel, определив его datacontextв xaml.
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
Сначала в viewmodel есть странность способа работы шаблонов.Если вы хотите сбросить (несвязанное) состояние просмотра, то вам нужно принудительно повторно шаблонизировать, сначала установив для свойства SubVM значение null.Эта команда принимает Type в качестве параметра
private RelayCommand<Type> navigateCommand;
public RelayCommand<Type> NavigateCommand
{
get
{
return navigateCommand
?? (navigateCommand = new RelayCommand<Type>(
vmType =>
{
CurrentViewModel = null;
CurrentViewModel = Activator.CreateInstance(vmType);
}));
}
}
Очевидно, что это не спрятало ни одного экземпляра vm в словаре, оно просто создает каждый раз экземпляр.