我正在使用带有model-view-viewmodel模式的WPF。我有一个ResultsView和ResultsViewModel,它们连接如下:
<DataTemplate DataType="{x:Type VM:ResultsViewModel}">
<VW:ResultsView/>
</DataTemplate>
在我的主窗口中,我有一些分页设置,其中MainContent属性存储当前页面(ViewModel实例)。
我像这样创建页面
MainContent = new ResultsViewModel();
ResultsView基于UserControl,它还有一个Loaded事件的处理程序,可以执行一些UI初始化工作。
当用户在不同页面之间导航时,一切正常。
但是如果用户连续两次打开ResultsView,则第二次调用ResultsView构造函数 ,并且不调用Loaded事件。看来现在我有了相同的旧ResultsView实例附加到新的ResultsViewModel()!
为什么每次创建新的ViewModel时WPF都不会创建新的视图?如果旧的视图模型被破坏,有什么办法可以强制WPF丢弃旧视图吗?
答案 0 :(得分:8)
<DataTemplate x:Shared="False" DataType="{x:Type VM:ResultsViewModel}">
<VW:ResultsView/>
</DataTemplate>
答案 1 :(得分:2)
请参阅肯特关于您的问题的实际解决方法的答案。
也就是说,只实例化一次View是一个好习惯,因为构建Visual Tree和设置所有绑定都会产生开销。通常应该设计View / ViewModel,以便您可以在没有View关注或甚至注意的情况下交换底层ViewModel(除了DataContext更改,因此重新评估所有绑定值。)如果您当前在Loaded事件中有逻辑,准备一个特定的ViewModel,考虑注册DataContext何时更改的通知(参见this example)。