如何在WPF中组织模型/视图/视图模型?

本文关键字:模型 视图 WPF | 更新日期: 2023-09-27 18:17:00

这一直是我的烦恼,所以我想我应该征求一下建议。如何在WPF(解决方案资源管理器)中组织模型/视图/视图模型?我似乎永远找不到一个令我满意的解决方案,所以我想知道是否有人有。

如何在WPF中组织模型/视图/视图模型?

除了模型应该在它们自己的程序集(项目)中这一事实之外。我倾向于把相关视图和ViewModels放在一个文件夹中,而不是有一个名为"Views"的文件夹和另一个名为"ViewModels"的文件夹

例如:

Project MyApp.Model
    |---> Models

Project MyApp.Client
    |--> Orders
    |      |--> OrderCRUDView
    |      |--> OrderCRUDViewModel
    |      |--> OrderListView
    |      |--> OrderListViewModel
    |--> Accounts
           |--> AccountCRUDView
           |--> AccountCRUDViewModel
           |--> AccountListView
           |--> AccountListViewModel
    ...etc

如何在WPF(解决方案资源管理器)中组织模型/视图/视图模型?

我通常将模型放在一个单独的项目中。MVVM的主要目标之一是保持模型完全与视图和ViewModel隔离。

View和ViewModel取决于-我个人的组织风格根据项目范围而不同。

对于非常小的项目,我经常为每个"视图"并排设置View和ViewModel。

对于较大的项目,我会将它们分开到它们自己的命名空间(和文件夹)中,或者甚至分开到单独的项目中。将ViewModel置于与View分离的项目中是很好的,因为它可以强制使ViewModel不引用View元素,因为您可以完全将所需的引用从该项目中删除。

在一个更大的应用程序中,你可能想把东西扔到单独的程序集中,但我认为这将工作得很好。

Project MyApp
    |--> Views
    |      |--> AccountsView
    |      |--> OrderView
    |--> Sources
           |--> CustomerData
                  |--> Data
                  |     |--> DataAccess.cs    <-- Provides database search helper methods that return ObservableCollections of "Model" data types for use in the ViewModels.
                  |--> Models
                  |     |--> Account.cs
                  |     |--> Order.cs
                  |--> ViewModels    <-- Having more then one viewmodel for the same data is possible, e.g. Master-Detail scenarios.
                        |--> AccountsViewModel.cs
                        |--> OrderViewModel.cs

我把它们分成不同的项目,然后再细分。基本上是M项目,VM项目,然后View为主要项目。尽管最终V &

我是一个'Solution Folder'人…

我将给定的V和VM放在同一个程序集中,并将所有V/VM程序集放在Visual Studio创建的"解决方案文件夹"中。

模型和实用程序类被组装隔离,也被推入"解决方案文件夹"。

当然,还有一个名为"Infrastructure"的解决方案文件夹,其中包含魔法字符串等…

解决方案文件夹是一个逻辑名称。它们不会在驱动器上创建物理文件夹。

这是我近十年来进行重要项目的基本设置,它的简单性使我受益匪浅。在同一个项目中保持视图和视图模型的可怕做法似乎是一个棱镜的事情,但是MVVM社区在十年前就把这种反模式打倒了。

客户端:

ProjectName.Client.csproj
    --Assets
    --Images
    --Brushes
    --DataTemplates
    --Styles
    --Controls
    --Helpers
    --Views
ProjectName.Client.ViewModel.csproj
    --ModelViews
    --ViewModels
    --Helpers

服务器层:

ProjectName.Server.Services.csproj
ProjectName.Data.csproj
ProjectName.Model.csproj

视图模型层不引用存在于服务器层的"模型"项目,而是通过数据服务引用的代理公开给视图模型。