为简单起见,我将保留INotifyPropertyChange.
以下类显然是一个模型:
class CountryModel { public string Name { get; set; } public string Location { get; set; } }
您最常在网上看到的是视图模型定义如下:
class Countryviewmodel { public Countryviewmodel { // initialize data (not ideal place,I know,but keeping it simple!) } public ObservableCollection<CountryModel> Countries { private get; set; } }
为什么以上不是国家模型,例如CountriesModel?为什么它被视为视图模型?
技术上应该如此吗?我们应该为视图模型设置另一个类吗?
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的数据.
此外,如果您坚持使用Web上的内容,即包含可观察的CountryModel集合的CountryModel和Countryviewmodel,那么您将如何处理包含每个城市列表的国家/地区?我将城市模型作为POCO,然后对于城市列表,我将创建一个具有可观察的CityModel集合的Cityviewmodel.
但那又怎样?我应该将Cityviewmodel作为CountryModel的一部分吗?这似乎不对!也许是这样,有人可以澄清一下.这是我更加困惑的地方,因为我创建了一个具有属性Name,Location和List< CityModel>类型属性的CountryModel,但是我如何在MVVM中正确表示这一点?
如何正确定义?特别是您拥有对象列表的部分以及每个对象都包含另一个列表.哪个是模型,视图模型以及如何处理模型中的列表?
解决方法
至于你的问题/例子,如果你的应用程序中有一个代表国家和城市的视图,那么是的,拥有一个由Cityviewmodel组成的Countryviewmodel以及任何其他帮助的视图模型都是完全可以接受的.包含该特定视图的数据.也可以在视图模型中使用继承,以便您可以拥有基本视图模型类,该类可以保存任何出错的错误信息,例如检索数据的问题,映射数据的问题或验证数据的问题.
由于您通常希望在应用程序中为每个视图创建一个视图模型,因此您很多时会得到一组与您的域模型对象的CRUD操作相匹配的视图模型.例如,假设您有一个帐户域模型,那么您可能拥有CreateAccountviewmodel,DisplayAccountviewmodel,DeleteAccountviewmodel和UpdateAccountviewmodel.
很多人都担心代码中的重复,并认为拥有一个在结构和数据类型上几乎相同的域模型和视图模型是错误的,但要记住它们的用途非常不同;存在域模型以便于您正在处理的问题空间的数据,而存在视图模型以便于在视图中向用户显示信息的数据.
在数据访问层中具有与域模型不同的数据模型类也是闻所未闻的,但是镜像从数据库表中检索的数据的结构.这就是你如何使用像Dapper这样的微型ORM.您不是编写ADO.NET DataReader映射逻辑,而是创建一个数据模型类,该类与您用于从数据库中检索数据的查询中的列名匹配,然后将该类用作“转储”数据的对象.从那里你可以有映射逻辑来构建一个域模型类,它可以传递回应用程序的各个层.