C# 视图未更新(更改ViewModel但不更改ViewModel类型)

C# 视图未更新(更改ViewModel但不更改ViewModel类型),c#,wpf,mvvm,C#,Wpf,Mvvm,我使用经典的MVVM模式,将DataTemplats定义为资源,然后将内容属性绑定到视图中相应的ViewModels。数据模板的定义如下: <Application.Resources> <DataTemplate DataType="{x:Type vm:PersonViewModel}"> <vw:PersonView/> </DataTemplate> <DataTemplate DataType

我使用经典的MVVM模式,将DataTemplats定义为资源,然后将内容属性绑定到视图中相应的ViewModels。数据模板的定义如下:

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:PersonViewModel}">
        <vw:PersonView/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:ProductViewModel}">
        <vw:ProductView/>
    </DataTemplate>
</Application.Resources>
如果我点击一个产品,我当然会:

DetailsViewModel = new ProductViewModel();
只要我在左侧面板中在person和product之间切换,正确的视图就会加载到ContentPresenter中


但问题是。如果单击相同类型的对象(即单击人员A,然后单击人员B),视图将不会更新以反映ViewModel中的更改。注意,此时我们创建了PersonViewModel的一个新实例,并将其分配给DetailsViewModel。设置DetailsViewModel将正确引发事件,但PersonView的代码隐藏文件中的InitializeComponent()永远不会被调用。这里发生了什么,我能做些什么来解决它呢?

我以前使用过这个精确的模式,它已经起作用了

两件事:

我假设ViewModel上的
DetailsViewModel
属性为 引发
属性更改
事件

“我的视图”的数据模板还定义了一个
DataContext=“{Binding}”

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

我以前使用过这种精确的模式,而且效果很好

两件事:

我假设ViewModel上的
DetailsViewModel
属性为 引发
属性更改
事件

“我的视图”的数据模板还定义了一个
DataContext=“{Binding}”

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


单击相同类型的对象是什么意思?我的意思是,当我单击Person a时,我将设置DetailsViewModel=new PersonViewModel(“Person a”);当我点击另一个人时,我会设置DetailsViewModel=newpersonviewmodel(“personb”);这是在单击列表时调用的命令内完成的。属性DetailsViewModel使用新的视图模型实例更新,但视图模型的类型没有更改。我希望我的新视图模型能够刷新或重新创建视图,但这并没有发生。它只会显示A个人的数据。@sunefred你知道这是什么原因吗?看到类似的东西。单击相同类型的对象是什么意思?我的意思是,当我单击Person a时,我将设置DetailsViewModel=new PersonViewModel(“Person a”);当我点击另一个人时,我会设置DetailsViewModel=newpersonviewmodel(“personb”);这是在单击列表时调用的命令内完成的。属性DetailsViewModel使用新的视图模型实例更新,但视图模型的类型没有更改。我希望我的新视图模型能够刷新或重新创建视图,但这并没有发生。它只会显示A个人的数据。@sunefred你知道这是什么原因吗?看到一些类似的东西。为了100%确定,即使您从PersonViewModel的一个实例切换到PersonViewModel的另一个实例,这也适用于您?我观察到了完全相同的行为。当my ContentPresenter的内容更改为具有相同类型的另一个实例时,将不会创建新的视图实例。我仍在调查解决方法。是的,我已确认绑定到ContentPresenter的属性。Content属性正在引发属性更改事件。请100%确定,即使您从PersonViewModel的一个实例切换到PersonViewModel的另一个实例,这也适用于您?我观察到了完全相同的行为。当my ContentPresenter的内容更改为具有相同类型的另一个实例时,将不会创建新的视图实例。我仍在调查解决方法。是的,我已确认绑定到ContentPresenter.Content属性的属性正在引发属性更改事件。
<DataTemplate DataType="{x:Type vm:PersonViewModel}">
  <vw:PersonView DataContext="{Binding}"/>
</DataTemplate>