WPF中MVVM的项目结构

use*_*422 56 c# wpf xaml mvvm

在WPF中使用MVVM时,您最终得到的项目结构是什么?

从我现在看到的教程中,他们通常有文件夹:Model,ModelView和View.

在Model中,您可以将Person等类放在捕获数据和逻辑的类中.

在ModelView中,您实例化Model中定义的类.视图包含.xaml文件.

编辑:我编辑我的原始帖子以发送示例项目结构.我有与此有关的问题.我如何组织这些:App.config App.xaml MainWindow.xaml

我应该像现在一样将它们留在外面,还是应该将它们放在某个文件夹中?

在此输入图像描述

She*_*dan 62

您已经描述了常用或常用的文件夹布局.根据经验,我更喜欢为模型数据类型添加单独的文件夹(或大型应用程序中的项目),例如Person您提到的典型类.我这样做的原因是因为这经常成为最大的项目之一.我还将其拆分为以下子文件夹:

DataTypes
    Collections
    Enums
    Interfaces
Run Code Online (Sandbox Code Playgroud)

我还有应用程序Converter类,扩展方法类,实用程序(或服务)类的单独文件夹(或大型应用程序中的项目).最后,我有与应用程序文件夹结构非常匹配的测试项目.总的来说,这大致是我的文件夹的样子:

Solution

    Third Party Libraries <<< (Solution Folder)

    StartUp Project
        Images
        Resources

    Converters

    DataTypes
        Collections
        Enums
        Interfaces <<< (For Data Type classes)

    Extensions

    Models
        Data Controllers
        Data Providers
        Interfaces <<< (For swapping Model classes out in test projects)

    Utilities (Or Services)
        Interfaces <<< (For swapping Utilities classes out in test projects)

    View Models
        Commands

    Views
        Attached Properties
        Controls
Run Code Online (Sandbox Code Playgroud)

更新>>>

项目,如文件夹,只提供分离级别.它们还帮助我绘制我的应用程序命名空间.例如,Collections文件夹/项目中的代码类将位于ApplicationName.DataTypes.Collections命名空间中.在类Data Providers文件夹/项目将有ApplicationName.Models.DataProviders命名空间.

此外,在大型应用程序中,我的项目名称来自它们在此层次结构中的位置...例如,我的DataTypes项目实际上已被调用ApplicationName.DataTypes,我的Models项目被调用ApplicationName.Models.在CollectionsDataProviders零件文件夹,所有的项目过去的第二个层次,例如一起.Enums,Images,Commands,等.

  • 将`Commands`放入`ViewModels`只是不需要在`ViewModels`项目中添加另一个引用.我以前有一个单独的`Commands`项目,但我很快就意识到`ViewModels`是唯一一个曾经使用它们的项目,因此将它移到那里似乎是合乎逻辑的.另外,我在该文件夹中只有一个类; 它是'RelayCommand'的一种形式,因此我所有的`Command`对象都只使用`delegate`s和普通方法.*如果*我有很多实际的`Command`类,我*可能会试图给它自己的项目. (3认同)
  • 有趣的是,您将命令放在视图模型中?怎么来的?我看到很多人只是将命令作为与其他任何东西分开的文件夹。 (2认同)
  • 嗯,所有这些都是独立的项目?不是文件夹吗? (2认同)
  • 它们可以是......我在小型应用程序中使用文件夹,在大型应用程序中使用项目.它只取决于每个类中有多少个类. (2认同)

Ben*_*hon 23

大多数人使用你提到的"标准"结构:

  • 模型/
    • CarModel.cs
    • DriverModel.cs
  • 视图模型/
    • CarViewModel.cs
    • DriverViewModel.cs
  • 视图/
    • CarView.xaml
    • DriverView.xaml

我认为它受欢迎的原因是因为有些人会认为你应该能够将Models,ViewModel和Views放在不同的程序集中.

还利用这种结构,您可以轻松地将文件夹添加其他东西WPF: ,Converters/, Resources/等.

在我的团队中,我们使用这个结构,但我们将名称复数化(因此模型/ ViewModels/Views).

但是,大多数情况下,模型类是在其他程序集/命名空间中定义的; 在这种情况下,我们甚至没有Models/文件夹.

对于大型项目,我们将子文件夹添加到Models/,ViewModels/Views/

为了完整起见,值得一提的是,您可能会发现一些人使用"特征驱动"结构:

  • 汽车/
    • CarModel.cs
    • CarViewModel.cs
    • CarView.xaml
  • 驱动器/
    • DriverModel.cs
    • DriverViewModel.cs
    • DriverView.xaml

但这种情况非常罕见.

  • 特征驱动结构在复杂应用程序中非常常见,因为它们可以更好地聚焦.但是,我只看过那里的视图和视图模型,而不是模型.无论如何,它们都在一个单独的组件中. (6认同)
  • `App.xaml`和`App.config`保留在项目的根目录下.`MainWindow.xaml`应该进入`Views /`(并有一个视图模型) (2认同)