2015-11-19 4 views
0

Я использую классический шаблон 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 за файлом никогда не вызывается. Что здесь происходит, и что я могу сделать, чтобы решить эту проблему?

+0

Что означает, что вы нажимаете объект того же типа? Больше кода, отражающего такую ​​ситуацию, будет очень признателен. – Maximus

+0

Что я имею в виду, когда я нажимаю Person A, я установлю DetailsViewModel = новый PersonViewModel («Person A»); и когда я нажимаю другого человека, я установлю DetailsViewModel = новый PersonViewModel («Лицо B»); Это делается внутри команды, вызываемой при нажатии на список. Свойство DetailsViewModel обновляется с помощью экземпляра новой модели представления, но тип модели представления не изменился. Я бы ожидал, что моя новая модель представления обновит или воссоздает представление, но этого не происходит. Он просто покажет данные для Person A. – sunefred

ответ

0

Я использовал этот точный шаблон раньше, и он сработал.

Две вещи:

Я полагаю, ваш DetailsViewModel собственности на ViewModel является воспитывающей PropertyChanged событие

Шаблон данных для моих взглядов также имеет DataContext="{Binding}" определен.

<DataTemplate DataType="{x:Type vm:PersonViewModel}"> 
    <vw:PersonView DataContext="{Binding}"/> 
</DataTemplate> 
+0

. Чтобы быть на 100% уверенным, это работает на вас, даже если вы переключаетесь с одного экземпляра PersonViewModel на другой экземпляр PersonViewModel? – sunefred

+0

Я наблюдаю то же самое поведение. Когда содержимое моего ContentPresenter изменится на другой экземпляр с тем же типом, новый экземпляр представления не будет создан. Я все еще изучаю обходной путь. –

+0

И да, я подтвердил, что свойство, связанное с свойством ContentPresenter.Content, вызывает событие с измененным свойством. –

Смежные вопросы