Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
Wpf ViewModel和用户界面项目位置_Wpf_Visual Studio_Mvvm - Fatal编程技术网

Wpf ViewModel和用户界面项目位置

Wpf ViewModel和用户界面项目位置,wpf,visual-studio,mvvm,Wpf,Visual Studio,Mvvm,我正在编写一个wpf项目,并使用MVVM范式,我想知道的是我是否应该在自己的项目中编写视图模型类 我所看到的优点是,您的ui项目永远不必知道您的业务逻辑。(没有提及) 但是,如果我想在视图模型中使用ICommand接口,我仍然需要对PresentationCore的引用,这可能表明我应该在ui项目中 非常感谢您的评论和建议。我不认为有一种压倒一切的令人信服的方式来做这件事。我倾向于将虚拟机及其视图放在同一个程序集中,但放在不同的文件夹结构中。例如,我可能有ViewModels/Foo/Bar/C

我正在编写一个wpf项目,并使用MVVM范式,我想知道的是我是否应该在自己的项目中编写视图模型类

我所看到的优点是,您的ui项目永远不必知道您的业务逻辑。(没有提及)

但是,如果我想在视图模型中使用ICommand接口,我仍然需要对PresentationCore的引用,这可能表明我应该在ui项目中


非常感谢您的评论和建议。

我不认为有一种压倒一切的令人信服的方式来做这件事。我倾向于将虚拟机及其视图放在同一个程序集中,但放在不同的文件夹结构中。例如,我可能有ViewModels/Foo/Bar/CustomerViewModel和Views/Foo/Bar/CustomerView.xaml


我认为拆分视图和视图模型也没有问题。拥有与VM程序集引用视图相关的程序集(如PresentationCore)是很自然的。毕竟,视图模型是视图层的一部分。

一旦您在视图模型中引用PresentationCore(如果您想使用ICommand,这是当前无法避免的),您就会将各种不需要的视图相关功能泄漏到视图模型中。例如,MessageBox.Show,当您在单元测试中看到这个调用时,它会让您明白为什么它不好

要回答此问题,请将视图和ViewModel保留在单独的项目中。我自己也很想知道这一点,但在经历了单独的项目之后,我花了一段时间才意识到这一点,但这对我坚持使用干净的MVVM解决方案非常有价值,从中得到的经验教训大大改进了我的整体解决方案体系结构。所有这些都是关于使用接口和适配器模式(如有必要)减少对不必要程序集的依赖性。一个例子是,我的视图项目作为入口点有一个对Ninject的引用,但我不希望我的ViewModel有那个引用。否则,可能会有人直接使用Ninject静态内核


关于ICommand,我不知道自4年以来只使用WPF的历史,但感觉MVVM是事后才想到的。我不知道为什么微软会把这个界面放在PresentationCore中。我希望在未来的版本中,ViewModel层会有一个单独的组件来解决这个问题。

不过,这可以归结为规程。如何防止无纪律的开发人员从VM程序集中添加对PresentationFramework的引用?无论您是否已将VM分离到另一个程序集中,都需要遵守规则。