它执行第一个Code Behind或View Model

时间:2013-04-18 02:40:20

标签: c# wpf xaml mvvm conceptual

根据我之前的问题Accessing variables from XAML and object from ViewModel using Code Behind:  我怎么知道哪个先执行?

是后面的代码还是ViewModel?
我只是想确保我的代码在ViewModel

之前执行

1 个答案:

答案 0 :(得分:4)

View和ViewModel都是实例化的常规类。这是通过像在任何其他类中一样调用构造函数来完成的。所以,作为你的问题的一个简单答案:在每个构造函数中设置一个断点,看看哪一个被击中。

您的问题没有一般性答案,因为它取决于您的架构和用例。通常,某些控件绑定到其父级的ViewModel的属性,该属性在某些时候会发生变化。此时,您的View已经存在,并且您不知道该属性已设置的值已存在多长时间。在其他情况下,您的View是为特定的ViewModel创建的,并将其作为构造函数参数。

确保在View之前存在ViewModel的一种方法是将ViewModel作为构造函数参数传递。构造函数参数背后的想法是表达:“此类需要创建类型为xy的现有实例”,这正是您所要求的。但是,正如您将在构造函数中将其设置为视图DataContext并且DataContext在创建视图后可以更改,您无法确定视图是否会在以后分配新的ViewModel创建。更糟糕的是,你将无法在XAML中使用你的控件,因为它不再具有默认构造函数。

根据您的第一个问题,尚不清楚为什么ViewModel应该在View之前存在。如果您需要从View中读取资源值并将其分配给ViewModel上的属性,我希望它是另一种方式?或者您是否在ViewModel中访问View(不要!)?

问题是,为什么你必须首先提出这个问题。在你的(或你的老板......)概念中有一些相当不对的东西:View和ViewModel是两个实体,它们应该在不知道彼此的情况下才能真正起作用。我们的想法是通过在ViewModel上获取/设置值来构建可以在没有单个View存在的情况下完美运行的应用程序,并且拥有可以在没有ViewModel的情况下完美编译任何运行的Views,只是没有任何显示或执行...如果您尝试要破解这种方法,你最好不要使用MVVM。