C# MVVM–;模型的正确实现

C# MVVM–;模型的正确实现,c#,mvvm,C#,Mvvm,上下文: C#/WPF Windows应用商店应用程序使用SQLite本地存储数据,通过web访问下载数据 应用程序: 数据必须从web下载并映射到存储在本地SQLite数据库中的类。例如,在Customer类中: 该类由不同的线程操作,因此在Customer类中更改INotifypropertyChanged是个坏主意。此外,GUI应该显示多个客户,因此ViewModel包含客户列表。此外,客户必须通过几个属性进行扩展,才能通过GUI正确显示 问题: 模型是什么?顾客 我应该如何使用附加属性

上下文:
C#/WPF Windows应用商店应用程序使用SQLite本地存储数据,通过web访问下载数据

应用程序:
数据必须从web下载并映射到存储在本地SQLite数据库中的类。例如,在Customer类中:

该类由不同的线程操作,因此在Customer类中更改INotifypropertyChanged是个坏主意。此外,GUI应该显示多个客户,因此ViewModel包含客户列表。此外,客户必须通过几个属性进行扩展,才能通过GUI正确显示

问题:
模型是什么?顾客
我应该如何使用附加属性扩展客户,而不破坏客户类
在数据库中存储客户或从web下载并映射数据到客户类的业务逻辑应该在哪里?在模型中

如果您的答案是客户就是模型,它不应该包含任何逻辑,那么为什么MVVM模式会说模型包含业务逻辑

在这种情况下,客户可以确定型号。模型应该是,并且仅由GUI使用的每个属性都应该在视图模型中,例如CustomServiceWModel

业务逻辑应该在模型中。存储在数据库中可以通过使用解决

模型通常有逻辑,但仅限于业务逻辑。根据MVVM,您不应该将任何UI逻辑放在模型中,而应该放在视图模型中

假设我们有你的模型

class Customer {
    public int Id { get; set; } 
    public string Name { get; set; }
}
而且需要用大写字母显示客户的姓名。在视图模型中添加一个属性,而不是向Customer类添加其他属性

class CustomerViewModel implements INotifyPropertyChanged  {
    ...
    public string UpperCaseName { ... }
    ...
}
我认为这篇文章总结得很好:

型号

模型是指表示真实状态内容的域模型(一种面向对象的方法),或者是指数据访问 表示该内容的层(以数据为中心的方法)

查看

与MVC和MVP模式一样,视图是用户界面(UI)

查看模型

视图模型是公开公共属性和命令的视图的抽象。而不是MVC模式的控制器, 或者MVP模式的演示者,MVVM有一个活页夹。在视图中 模型,此绑定器调解视图和 数据活页夹。已经描述了视图模型 作为模型中数据的状态

活页夹

声明性数据和命令绑定在MVVM模式中是隐式的。在Microsoft解决方案堆栈中,活页夹是一个标记 一种叫做XAML的语言。这种活页夹使显影剂不必再使用了 必须编写锅炉板逻辑以同步视图模型和 看法在Microsoft堆栈之外实现时,存在 声明性数据绑定技术是该模式的关键促成因素

模型是什么

作为数据框架的实体或任何类

我应该如何使用附加属性扩展客户,而不破坏客户类

通过
部分
类修饰符。允许您将专用逻辑放入扩展操作/属性中。此外,您还可以更改客户对INotifyProperty的遵守

在数据库中存储客户或从web下载并映射数据到客户类的业务逻辑应该在哪里?在模型中

将所有业务逻辑放在
视图模型中
以获取和存储信息。它是神奇发生的地方,是
视图
模型
之间的一条管道,供
视图
显示

为什么MVVM模式说模型包含业务逻辑

业务逻辑的形式是组成数据的实体


刚接触MVVM的人会因为怀疑自己是否正确地遵循MVVM而挂断电话。MVVM(IMHO)只是一个三层数据系统(记住这个范例),它将数据从逻辑中分离出来,以获取数据并最终显示数据;三层

如果将MVVM视为旧式的三层数据系统,其中VM包含/获取数据(称为模型),并处理业务逻辑以处理数据,只允许视图显示所述数据;就这么简单

class CustomerViewModel implements INotifyPropertyChanged  {
    ...
    public string UpperCaseName { ... }
    ...
}