在分层数据结构中向MVVM添加编辑

时间:2010-07-29 09:37:33

标签: c# mvvm data-binding hierarchical-data two-way-binding

这个问题是this older一个问题的后续问题,它更多的是确认而非开放式问题。

我的ViewModel实例有一个模型的私有实例_modelInst ViewModel在编辑期间可以独家访问Model的数据(因此Model不需要实现INotifyPropertyChanged)。

现在我有三种方法可以从视图中编辑模型数据:

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

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

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

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

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

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

    • 通过

      向父母发送更新说明
      1. 命令
      2. 消息
      3. 反射(父母知道哪个孩子称为功能
        通过将实例与所有存储的孩子进行比较)
      4. 所有这些都是一个很大的混乱实现,创建功能 模型中可编辑的每个字段。
        这几乎意味着该模型的所有领域..​​....

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

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

2 个答案:

答案 0 :(得分:2)

希望这些资源能够提供帮助;当我学习MVVM以及如何使用视图模型表示对象图/层次结构时,他们帮助了我很多:

  1. Editable Object Adapter
  2. Editable Collection Adapter
  3. MicroModels

答案 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 "";
}

}

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

由于