我使用经典的MVVM模式,我将DataTemplats定义为资源,然后将Content属性绑定到视图中的相应ViewModel。 DataTemplates的定义如下:
<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>
在我的用户界面中,我有一个左侧面板,上面有一个项目列表,让我们说人和产品。在右侧,我正在加载每个项目的详细信息。当我点击一个人时,我将改变MainViewModel的DetailsViewModel属性,如下所示:
DetailsViewModel = new PersonViewModel();
如果我点击一个产品,我会在那里做:
DetailsViewModel = new ProductViewModel();
只要我在左侧面板中的人和产品之间切换,正确的视图就会加载到ContentPresenter中。
但这是问题所在。如果我单击相同类型的对象(即单击人员A,然后单击人员B),视图将不会更新以反映ViewModel中的更改。请注意,此时我们创建PersonViewModel的新实例并将其分配给DetailsViewModel。设置DetailsViewModel将正确引发一个事件,但永远不会调用PersonView的代码隐藏文件中的InitializeComponent()。这里发生了什么,我该怎么做才能解决它?
答案 0 :(得分:0)
之前我已经使用了这个确切的模式并且它已经有效了。
两件事:
我假设ViewModel上的DetailsViewModel
属性是
提出PropertyChanged
事件
我的观看次数的数据模板也定义了DataContext="{Binding}"
。
<DataTemplate DataType="{x:Type vm:PersonViewModel}">
<vw:PersonView DataContext="{Binding}"/>
</DataTemplate>