根据我之前的问题Accessing variables from XAML and object from ViewModel using Code Behind:我怎么知道哪个先执行?
是背后的代码还是 ViewModel?
我只想确保我的代码在 ViewModel 之前执行
根据我之前的问题Accessing variables from XAML and object from ViewModel using Code Behind:我怎么知道哪个先执行?
是背后的代码还是 ViewModel?
我只想确保我的代码在 ViewModel 之前执行
View 和 ViewModel 都是被实例化的常规类。这是通过像在任何其他类中一样调用构造函数来完成的。因此,作为对您问题的简单回答:在每个构造函数中设置一个断点,然后查看哪个构造函数首先被命中。
您的问题没有通用答案,因为它取决于您的架构和用例。通常,某些控件绑定到其父视图模型的属性,该属性会在某些时候发生变化。那时,您的 View 已经存在,并且您不知道该属性设置的值已经存在多长时间。在其他情况下,您的 View 是为特定的 ViewModel 创建的,并将其作为构造函数参数。
确保 ViewModel 在 View 之前存在的一种方法是将 ViewModel 作为构造函数参数传递。构造函数参数背后的想法是表达:“此类需要创建 xy 类型的现有实例”,这就是您所要求的。但是,由于您将DataContext
在构造函数中将其设置为 View,并且DataContext
在创建 View 后可以更改,因此您无法确定 View 在创建后不会获得分配的新 ViewModel。更糟糕的是,您将无法再在 XAML 中使用您的控件,因为它不再具有默认构造函数。
根据您的第一个问题,尚不清楚为什么 ViewModel 应该在 View 之前存在。如果您需要从 View 中读取资源值并将其分配给 ViewModel 上的属性,我希望它会反过来吗?或者您是否正在访问 ViewModel 中的视图(不要!)?
问题是,为什么你必须首先问这个问题。您(或您的老板......)的概念有一些非常错误的地方:View 和 ViewModel 是两个实体,它们应该在不知道彼此的情况下真正工作。这个想法是构建可以在没有单个视图的情况下完美运行的应用程序,只需在 ViewModels 上获取/设置值,并让 Views 可以在没有 ViewModels 的情况下完美地编译任何运行,而无需显示或做任何事情......如果你尝试要破解这种方法,最好不要使用 MVVM。