这个问题是this older一个问题的后续问题,它更多的是确认而非开放式问题。
我的ViewModel实例有一个模型的私有实例_modelInst
ViewModel在编辑期间可以独家访问Model的数据(因此Model不需要实现INotifyPropertyChanged)。
现在我有三种方法可以从视图中编辑模型数据:
直接在模型实例上获取/设置
例如对于简单值字段
return _modelInst.fieldname;
_modelInst.fieldname = value;
这个很容易实现......
创建ViewModel实例并对父数据结构进行操作
例如对于更复杂的对象类型,如结构:
这意味着为这些结构中的每一个创建一个由父项实现的新接口(使用_modelInst
上的更新例程)。
创建不直接了解父数据结构的ViewModel实例
例如for(父类)中的(列表)
为每个类创建一个新的ViewModel
通过
向父母发送更新说明 所有这些都是一个很大的混乱实现,创建功能
模型中可编辑的每个字段。
这几乎意味着该模型的所有领域......
(4。)可以创建一个通用的ViewModel,它只通过反射工作,每个都是
子对象知道其父对象及其字段名(+索引,如果在列表中)
只有根的逻辑才会干扰模型
但该解决方案还需要一种方法来存储_modelInst
内的字段的路径。
还有其他(更简单)的方法来实现这个目标吗? 我是否(再次)误解了MVVM的原理? MVVM是否适合处理大型分层数据结构?
答案 0 :(得分:2)
希望这些资源能够提供帮助;当我学习MVVM以及如何使用视图模型表示对象图/层次结构时,他们帮助了我很多:
答案 1 :(得分:0)
这是一个很好的问题,我觉得MVC模式没有一个好的答案。
ViewModels在映射到的模型没有子项时效果很好。
但是当模型有孩子时,如
客户
-->Order
-->Country
(想象国家是客户的儿童对象)设计模式的类型分解。
我发现的最好的事情是使用继承并有选择地暴露 只有你需要viewmodel逻辑的那些孩子。否则,只需访问 将通过继承进入的视图的模型属性。
公共类CustomerView:客户//继承自Customer(model) {
public CustomerView(Customer customer)
{
this.FirstName = customer.FirstName
//etc..
//Only if you need it, that is if you have some display-specific
//logic relating to country for a given view, you create
//a CountryView class that inherits from Country and gets populated
//by an instance of it as well
this.CountryView = new CountryView(customer.Country)
}
public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it.
public string DisplayColor
{
if(base.FirstName == "Joe")
{
return "red";
}
return "";
}
}
与孙子女打交道时,这会变得混乱。如果有人有更好的解决方案,我很乐意听到。
由于