2011-05-05 50 views
1

我正在使用WPF和model-view-viewmodel模式。我有一个ResultsView和ResultsViewModel其连接这样的:为什么每次创建新视图模型时都不会调用视图构造函数?

  <DataTemplate DataType="{x:Type VM:ResultsViewModel}"> 
       <VW:ResultsView/> 
      </DataTemplate> 

在我的主要窗口,我有某种分页设置在哪里搜索Maincontent属性存储当前页面(视图模型实例)。

我创建这样

MainContent = new ResultsViewModel(); 

ResultsView网页是基于用户控件,它也有,做一些UI初始化加载的东西,事件的处理程序。

用户在不同页面之间导航时,一切正常。

但是,如果用户连续两次打开ResultsView,ResultsView构造函数是而不是第二次调用,并且Loaded事件未被调用。现在看来,我已经将相同的旧ResultsView实例附加到新的ResultsViewModel()!

为什么每次创建一个新的ViewModel时,WPF都不会创建一个新的View?如果旧的viewmodel被破坏,有什么办法可以强制WPF放弃旧的视图?

回答

8
<DataTemplate x:Shared="False" DataType="{x:Type VM:ResultsViewModel}"> 
    <VW:ResultsView/> 
</DataTemplate> 
+0

很酷,不知道x:共享修饰符。 – 2011-05-05 16:08:09

+0

对此有何评论? – MDDDC 2015-02-02 19:20:38

+0

如果共享未设置为false,则DataTemplate将加载“ResultsView”的相同实例。因此'ResultsView'的构造函数未被调用。 – jHilscher 2017-03-01 15:12:09

2

请参阅Kent的答案,以便为您的问题找到切实可行的解决方法。

也就是说,仅实例化视图是一种很好的做法,因为与构建可视树和设置所有绑定相关的开销。一般来说,View/ViewModel的设计应该是这样的,你可以在没有View关怀或者甚至没有注意的情况下交换出底层的ViewModel(除了DataContext发生变化,因此所有的绑定值都会被重新评估)。如果你当前在你的Loaded事件中有逻辑准备一个特定的ViewModel,考虑注册DataContext何时改变的通知(请参阅this example)。

+0

感谢您的想法,我会在设计我的下一个应用程序时使用您的建议方法。 – JustAMartin 2011-05-05 16:18:22