5

这个问题是这个旧问题的后续问题,它更像是一个确认而不是一个开放的问题。

我的 ViewModel 实例有一个模型的私有实例,_modelInst.
ViewModel 在编辑期间拥有对 Model 数据的独占访问权限(因此 Model 不需要实现 INotifyPropertyChanged)。

现在我想出了三种从视图中编辑模型数据的方法:

  1. 直接在模型实例上获取/设置,
    例如简单的值字段
    return _modelInst.fieldname;
    _modelInst.fieldname = value;
    这很容易实现......

  2. 创建一个 ViewModel 实例并在父级的数据结构上进行操作,
    例如对于更复杂的对象类型,如 structs

    • 为该类型创建一个新的 ViewModel。
      ViewModel 知道父级及其字段名。
    • 在 ContentControl+DataTemplate 中显示
    • 获取/设置:
      通过以字段名为参数的父类方法,
      覆盖整个原始对象,即使只更改了一个字段

    _modelInst这意味着为这些结构中的每一个创建一个由父级实现的新接口(使用更新例程)。

  3. 在不直接了解父类数据结构的情况下创建 ViewModel 实例,
    例如父类中的类(列表)

    • 为每个类创建一个新的 ViewModel

    • 通过发送更新指令给父母

      1. 命令
      2. 消息
      3. 反射(父母
        通过将实例与所有存储的孩子进行比较来知道哪个孩子调用了函数)

      所有这些都是一大堆实现,为模型的每个可编辑字段创建函数。
      这意味着模型的几乎所有领域..​​....

(4.) 可以创建一个仅通过反射工作的通用 ViewModel,其中每个子对象都知道其父对象及其字段名(+index,如果在列表中)。
然后只有根的逻辑会干扰模型。
但是该解决方案还需要一种方法来将路径存储在_modelInst.

有没有其他(更简单)的方法来实现这一点?
我是否(再次)误解了 MVVM 的原理?
MVVM 是否适合处理大型分层数据结构?

4

2 回答 2

2

希望这些资源会有所帮助;在我学习 MVVM 以及如何使用视图模型表示对象图/层次结构时,它们帮助了我很多:

  1. 可编辑对象适配器
  2. 可编辑集合适配器
  3. 微型模型
于 2011-07-15T20:59:34.213 回答
0

这是一个很好的问题,我认为 MVC 模式没有很好的答案。

ViewModel 在它们映射到的模型没有子模型时工作得很好。

但是当模型有孩子时,如

顾客

        -->Order

        -->Country

(想象 Country 是 Customer 的一个子对象)设计模式有点崩溃。

我发现的最好的事情是使用继承并有选择地只公开那些您需要视图模型逻辑的孩子。否则,只需访问将通过继承进入的视图的模型属性。

public class CustomerView : Customer //继承自 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 "";
}

}

这在与孙子打交道时会变得混乱。如果有人有更好的解决方案,我很想听听。

谢谢

于 2015-10-05T07:18:58.897 回答