- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对什么应该是模型或 View 模型以及它们应该如何命名感到困惑。
为简单起见,我将保留 INotifyPropertyChange
下面的类显然是一个模型:
class CountryModel
{
public string Name { get; set; }
public string Location { get; set; }
}
您在网络上最常看到的是 View 模型定义如下:
class CountryViewModel
{
public CountryViewModel
{
// initialize data (not ideal place, I know, but keeping it simple!)
}
public ObservableCollection<CountryModel> Countries
{
private get;
set;
}
}
为什么上面的不是Countries
的模型,即 CountriesModel
, 例如?为什么它被认为是 View 模型?
技术上应该是这样吗?那么我们是否应该为 View 模型创建另一个类?
class CountryViewModel
{
private ObservableCollection<CountryModel> _countries = new ....;
public CountryViewModel
{
}
public ObservableCollection<CountryModel> Countries
{
private get { return _countries ?? _countries = LoadCountries(); }
set { _countries = value; }
}
private ObservableCollection<CountryModel> LoadCountries()
{
ObservableCollection<CountryModel> countries = new ...;
foreach (CountryModel country in CountriesModel)
{
countries.add(country);
}
return countries;
}
}
上面说的有道理吗?我只是不明白为什么它似乎是一个标准以及为什么你会调用 CountriesViewModel
什么时候对我来说应该是CountriesModel
和一个 CountryViewModel
应该创建访问来自 CountriesModel
的数据.
此外,如果您坚持使用网络上的内容,即 CountryModel
和 CountryViewModel
包含 CountryModel
的可观察集合,那么你将如何处理包含每个城市列表的国家?我会有一个 CityModel
作为 POCO 然后对于城市列表,我将创建一个 CityViewModel
拥有 CityModel
的可观察集合.
然后呢?我应该制作 CityViewModel
吗?我的一部分 CountryModel
?这似乎根本不对!也许是这样,有人可以澄清这一点。这是我更加困惑的地方,因为我会创建一个 CountryModel
具有属性 Name
, Location
和 List<CityModel>
类型的属性,但我如何在 MVVM 中正确表示它?
如何正确定义这个?特别是你有一个对象列表并且每个对象都包含另一个列表的部分。哪个是模型、 View 模型以及如何处理模型中的列表?
最佳答案
通常,人们会为系统中的每个 View 创建一个 View 模型。 View 模型的目的是方便 View 的数据。 View 模型通常是其域模型副本的扁平化版本,但是当您拥有实际上只是数据传输对象 (DTO) 的扁平域模型时,这看起来会令人困惑。不要害怕拥有与领域模型非常相似的 View 模型;它们是旨在在应用程序的不同区域/层中生活和工作的数据的不同抽象。
至于您的问题/示例,如果您的应用程序中有一个以层次结构表示国家和城市的 View ,那么是的,完全可以接受由以下内容组成的 CountryViewModel
CityViewModel
,以及帮助构成该特定 View 数据的任何其他 View 模型。也可以在 View 模型中使用继承,这样您就可以拥有基础 View 模型类,其中包含任何出错的错误信息,例如检索数据的问题、映射数据的问题或验证数据的问题。
由于您通常希望应用程序中的每个 View 都有一个 View 模型,因此您最终会得到一组与域模型对象的 CRUD 操作相匹配的 View 模型。例如,假设您有一个 Account
域模型,那么您可能会有一个 CreateAccountViewModel
、DisplayAccountViewModel
、DeleteAccountViewModel
和 UpdateAccountViewModel
。
许多人担心代码中的重复,并认为拥有在结构和数据类型上几乎相同的域模型和 View 模型是错误的,但请记住它们的用途截然不同;领域模型的存在是为了促进您正在处理的问题空间的数据,而 View 模型的存在是为了促进在 View 中向用户显示信息的数据。
在数据访问层中有一个不同于领域模型的数据模型类也不是闻所未闻,但它反射(reflect)了从数据库表中检索的数据的结构。这就是您如何使用像 Dapper
这样的微型 ORM。您无需编写 ADO.NET DataReader
映射逻辑,而是创建一个数据模型类,该类匹配您用于从数据库中检索数据的查询中的列名,然后将该类用作对象将数据“转储”到。从那里你可以有映射逻辑来构建一个域模型类,该类被传递回你的应用程序的层。
关于c# - MVVM 中 Model 和 ViewModel 的澄清和命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18669793/
在此链接中:http://www.sencha.com/blog/spotlight-ext-js-customers/ 请滚动到部分:为什么我们选择 Ext JS 有这一行: By using Ex
只是想确保我正确理解这一点(我会在 SO Chat 上问,但它已经死在那里了!): 我们有一个顶点数组,我们通过绑定(bind)它使其成为“当前” 然后我们有一个缓冲区,我们将其绑定(bind)到目标
我正在学习与 Java Swing 一起使用的类(class),但我遇到了障碍。在这个项目中,我们正在为不同的组件设置大小,但是,导师特意敲了一行我不太理解的代码,我只是在寻找这行代码概念的解释。 基
所以我尝试创建一个 HttpsRequest,效果非常好。问题是,我做错了什么,我认为这可能是因为我使用 HttpResponse,但我没有找到任何与 Https 类似的东西。有没有一种方法可以像 h
我正在阅读 Martin Fowler 的“UML distilled”,在阅读关联类的过程中,我得到了这句话: What benefit do you gain with the associati
我只是询问此说明: String[][] s = new String[2][2]; 如果我创建这个变量“s”,我会创建一个包含 2 行和 2 列的字符串表吗?或者 2 个表有 2 个元素?感谢您的澄
我目前正在做的事情需要为世界各地的用户提供本地化时间。所有日期时间都存储为 UTC,因此转换它们非常容易,并且我们有一个已知的、安全的引用点等等。 但是,关于如何表达偏移量的一些事情让我摸不着头脑。
我开始学习 spring,我遇到了一个定义,它说“Spring 使开发人员能够在没有应用程序服务器的情况下进行企业开发”。 这到底是什么意思,使用应用服务器进行企业开发有什么危害。 但是开发者在进行企
我是 AngularJS 的新手,对如何设置 angularJS 进行开发感到困惑。 Link1 link1 说我们需要 node.js 和一系列其他工具,这些工具必须在使用 AngularJS 之前
我是 iPhone 和 iPad 应用程序的开发者。 我的一个应用程序是在线个人财务管理工具的配套应用程序,该工具通过网站提供其服务和功能。这些功能的一部分将通过我正在创建的原生 iOS 应用程序提供
我正在研究飞行模拟器。我读过一篇关于四元数的教程(这个:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quater
抱歉,如果这是一个微不足道的问题: 实现 1: class Foo { protected: int bar; public: Foo(int bar) {
作为 C 中实现定义行为的示例。C 标准规定数据类型的大小是实现定义的。因此,假设 sizeof(int) 是实现定义的。 此实现定义的行为是否意味着 size(int) 依赖于平台或由编译器供应商定
从理论上讲,inline 函数在 C 语言中具有内部/静态链接,也就是说,它们仅在单个翻译单元内可见。因此,在两个单独的文件中定义的内联函数应该无法相互看到,并且两者都有自己的地址空间。 我正在尝试使
对于神童来说,这可能是一个非常基本的问题。但我对处理它有疑问。 在转换期间我们使用: int.Parse(someThing) Convert.ToInt32 或 Convert.ToString()
这个问题在这里已经有了答案: Regarding Android Permissions and Signature Protection level (2 个答案) 关闭 8 年前。 由于我是An
我有这个功能: 函数 Foo(){} 根据这张图片: >> Foo.prototype -> Foo {} 所以如果我写: Foo.prototype.constructor 现在 - 它引
我读了this article关于 Task.ConfigureAwait,它有助于防止异步代码中的死锁。 看看这段代码:(我知道我不应该做 .Result ,但这是问题的一部分) private v
我正在学习 C#。我可以将闭包理解为一种可以适应其定义环境中的变化的结构吗。 示例: List gurus = new List() {
这个问题在这里已经有了答案: Difference between volatile and synchronized in Java (4 个回答) 关闭6年前。 我对我读到的关于 volatile
我是一名优秀的程序员,十分优秀!