Я использую классический шаблон MVVM, где я определяю DataTemplats как ресурсы, а затем привязываю атрибут Content к соответствующим ViewModels в представлении. В DataTemplates определяются следующим образом:Просмотр не обновления (изменение вида ViewModel, но не вида ViewModel)
<Application.Resources>
<DataTemplate DataType="{x:Type vm:PersonViewModel}">
<vw:PersonView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ProductViewModel}">
<vw:ProductView/>
</DataTemplate>
</Application.Resources>
В свете где-то я использую ContentPresenter и связать Content атрибут
<Grid DataContext={Binding MainViewModel, Source={StaticResource Locator}}"}>
<ContentPresenter Content="{Binding DetailsViewModel}"></ContentPresenter>
</Grid>
В моем пользовательском интерфейсе у меня есть левая панель со списком элементов, позволяет говорят лица и продукты. Справа я загружаю детали для каждого элемента. Когда я нажимаю человека я изменить свойство DetailsViewModel в MainViewModel так:
DetailsViewModel = new PersonViewModel();
И если я нажимаю продукт, который я тогда конечно сделать:
DetailsViewModel = new ProductViewModel();
Пока я переключаюсь между человеком и продукт на левой панели будет загружен правильный контент в ContentPresenter.
Но вот в чем проблема. Если я нажмю на объект того же типа (тогда щелкните человека A, а затем щелкните человека B), представление не будет обновляться, чтобы отразить изменение в ViewModel. Обратите внимание, что на этом этапе мы создаем новый экземпляр PersonViewModel и назначаем его в DetailsViewModel. Настройка элемента DetailsViewModel будет правильно поднять событие, но InitializeComponent() в коде PersonView за файлом никогда не вызывается. Что здесь происходит, и что я могу сделать, чтобы решить эту проблему?
Что означает, что вы нажимаете объект того же типа? Больше кода, отражающего такую ситуацию, будет очень признателен. – Maximus
Что я имею в виду, когда я нажимаю Person A, я установлю DetailsViewModel = новый PersonViewModel («Person A»); и когда я нажимаю другого человека, я установлю DetailsViewModel = новый PersonViewModel («Лицо B»); Это делается внутри команды, вызываемой при нажатии на список. Свойство DetailsViewModel обновляется с помощью экземпляра новой модели представления, но тип модели представления не изменился. Я бы ожидал, что моя новая модель представления обновит или воссоздает представление, но этого не происходит. Он просто покажет данные для Person A. – sunefred