Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪个执行第一个代码隐藏或视图模型_C#_Wpf_Xaml_Mvvm_Conceptual - Fatal编程技术网

C# 哪个执行第一个代码隐藏或视图模型

C# 哪个执行第一个代码隐藏或视图模型,c#,wpf,xaml,mvvm,conceptual,C#,Wpf,Xaml,Mvvm,Conceptual,根据我先前的问题: 我怎么知道哪个先执行 是代码隐藏还是视图模型? 我只想确保我的代码在ViewModel之前执行,View和ViewModel都是被实例化的常规类。这是通过像在任何其他类中一样调用构造函数来完成的。因此,作为对您的问题的简单回答:在每个构造函数中设置一个断点,然后查看哪个断点首先被击中 您的问题没有一般的答案,因为它取决于您的体系结构和用例。通常,某些控件绑定到其父控件的ViewModel属性,该属性会在某个点发生更改。此时,您的视图已经存在,您不知道属性设置为的值已经存在了多

根据我先前的问题: 我怎么知道哪个先执行

是代码隐藏还是视图模型?

我只想确保我的代码在ViewModel之前执行,View和ViewModel都是被实例化的常规类。这是通过像在任何其他类中一样调用构造函数来完成的。因此,作为对您的问题的简单回答:在每个构造函数中设置一个断点,然后查看哪个断点首先被击中

您的问题没有一般的答案,因为它取决于您的体系结构和用例。通常,某些控件绑定到其父控件的ViewModel属性,该属性会在某个点发生更改。此时,您的视图已经存在,您不知道属性设置为的值已经存在了多长时间。在其他情况下,将为特定的ViewModel创建视图,并将其作为构造函数参数

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

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


问题是,为什么你首先要问这个问题。您(或您的上司…)的概念中有一些非常错误的地方:视图和视图模型是两个实体,它们应该在彼此不了解的情况下真正工作。其思想是通过获取/设置ViewModels上的值来构建可以在没有单个视图的情况下完美运行的应用程序,并使任何视图都可以在没有ViewModels的情况下完美运行,而无需显示或执行任何操作。。。如果你试图破解这种方法,最好不要使用MVVM。

我相信你的问题脱离了具体的背景(具体的应用程序设计),即使在研究了你的上一个问题之后,我仍然怀疑你在问什么——完全可以用codebehind代替XAML,反之亦然。如果您在XAML中执行某些操作,那么您不会在codebehind中执行,反之亦然。无论如何,看看这个问题最终将如何回答是很有趣的。你看过我上面问题的相关主题了吗?我正在访问视图模型,以便使用代码隐藏将项目添加到现有列表中。但我想确保在执行视图模型中的任何内容之前发生这种情况。请参考下面的链接了解更多详细信息。这个问题没有多大意义。编译器处理完源代码后,您将得到一个类。代码由XAML生成,这就是.XAML.cs类在其定义中通常具有部分类的原因。您可能指的是XAML上的绑定何时初始化,当然是在
InitializeComponent()期间