为什么每次创建新的viewmodel时都不调用视图构造函数?

时间:2011-05-05 15:27:00

标签: wpf mvvm view constructor

我正在使用带有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丢弃旧视图吗?

2 个答案:

答案 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)。