【问题标题】:MVVM Read data from database to Model or to ViewModel?MVVM 从数据库读取数据到模型或视图模型?
【发布时间】:2020-06-19 09:38:22
【问题描述】:

我目前正在学习 WPF 和 MVVM,因此我决定创建一个示例应用程序。

据我所知,模型用于后端。例如。如果您将“Spaghetti”作为模型,它将具有“名称”、“颜色”、“长度”等属性。它遵循 1:1 的关系

视图模型用于前端,因此视图将使用您添加到视图模型的内容。例如显示 Spaghetti 不同名称的列表。

我正在尝试从数据库中读取数据并将所有意大利面条名称显示到视图中。我已经设法做到了,但我觉得我错过了 MVVM 的目标,因为我完成它的方式不需要模型。

代码如下:

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    MainWindowSpaghettiViewModel vm = new MainWindowSpaghettiViewModel();
    Service businessLogic = new Service();

    public MainWindow()
    {
        InitializeComponent();
        vm.SpaghettiNameCollection = businessLogic.GetSpaghettiNames();
        DataContext = vm;
    }
}

型号:Spaghetti.cs

public class Spaghetti
{
    public string Name { get; set; }
    public double Length { get; set; }
    public string Colour { get; set; }
    public decimal Price { get; set; }
}

查看模型:MainWindowSpaghettiViewModel.cs

public class MainWindowSpaghettiViewModel
{
    public List<string> SpaghettiNameCollection { get; set; }
}

业务逻辑层:Service.cs

public class Service : IService
{
    DBHelper db = new DBHelper();

    public List<string> GetSpaghettiNames()
    {
        return db.GetSpaghettiNames();
    }
}

数据访问层:DBHelper.cs 使用 select 语句返回意大利面条名称列表。

我是否正确地处理了这个问题,因为我之前看到过其他人直接从数据库填充视图模型属性的示例?

应用程序将如何流动?例如,在这个窗口中,我希望用户从我刚刚创建的列表中选择他们想要了解更多信息的意大利面条的名称。

选择意大利面条后,他们会转到下一个窗口,在那里他们可以看到有关意大利面条的所有信息(如模型中的属性)。我是只创建一个具有相同属性的新 ViewModel 并执行上面所做的操作,还是填充模型然后从中填充 ViewModel?

【问题讨论】:

    标签: c# wpf mvvm model


    【解决方案1】:

    目前看起来不错,但您可以使用 List&lt;Spaghetti&gt; 代替 List&lt;string&gt; 并从数据库中直接将项目读入 ViewModel 中的此列表。所以模型实际上是模板

    我理解正确吗?您的问题是为什么在将数据直接加载到 ViewModel 类时需要 Model 类?

    Model 实际保存数据并为 ViewModel 提供数据。 ViewModelView 的逻辑。

    如果您需要的视图数据多于 Model 可以提供但 Model 也不应该提供的数据,并为您提供创建 ViewModel Model 专用于 View 的数据,但使用来自 ModelData 填充它,例如SQL 数据库。否则,它是一样的。如果您只需要整个 Model 中的一小部分用于 View,则创建一个只有 PropertiesViewModel > 为此需要。

    例如,您有一个 TreeView,您需要一个名为“IsExpanded”的 Property 来控制它。此 Property 与纯 Data 无关,因此不应位于 Model 类本身中。非纯粹主义者会说没问题,但是您可以为该模型编写一个部分类,并通过数据库的属性忽略一些 View 所需的属性。

    如果您只向用户显示该 ModelName,那么拥有一个字符串类型的 List 就足够了。

    所以没有直接的答案。您可以直接通过 ViewModel 或通过另一个 ViewModel 为具有更少或更多属性的 Model 类公开您的 Data,字段等。

    他们选择意大利面后,会转到下一个窗口 可以看到有关意大利面条的所有信息(如属性 在模型中)。我是否只是创建一个具有相同功能的新 ViewModel 属性并执行我上面所做的事情,或者我填充模型然后 从中填充 ViewModel?

    看起来您需要为 View 本身存储在数据库中的相同属性。 您可以直接加载所有项目并使用它填充 Spaghettis 列表,或者仅填充字符串但如果在下一页或任何地方请求,则加载项目所需的数据。

    一般来说,如果您有大量数据,很多人会说:

    您不应该从数据库中加载所有数据,只加载您需要的数据。

    它认为这仅取决于数据。一些 MVVM 纯粹主义者总是会说,为 Model 创建一个 ViewModel,然后仅加载和公开当时需要的 Data

    我建议您阅读本文,希望对您有所帮助。如果您还有其他问题,请提出。

    https://www.wintellect.com/model-view-viewmodel-mvvm-explained/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      相关资源
      最近更新 更多