使用EF DbContext延迟加载的MVVM主/详细视图 - 多个ViewModel,或全部在一个VM中

时间:2012-08-06 21:12:28

标签: entity-framework mvvm dbcontext

我见过几个基本上为Master创建View-Model的代码示例,以及一个View-Model for the Details。然后,他们使用DataGrid将Master连接到View,然后将Master View-Model的选定项绑定到ObservableObject(DetailViewModel)类型的SelectedItem属性,然后将其发送到Detail View-Model,这是然后绑定到详细视图......例如推荐here。或类似this

之类的东西

阅读完本后...... http://blogs.msdn.com/b/adonet/archive/2011/03/08/ef-feature-ctp5-code-first-model-with-master-detail-wpf-application.aspx

这.. One Model Entity, Multiple Pages -> Multiple Views? Multiple ViewModels?

这...... Multiple ViewModels associated with a single view

我很困惑:)似乎首选的Prism方法是为主人和细节设置一个单独的ViewModel,但在我的原因中我觉得这样做会有更多的工作。

在我看来,如果您使用Entity Framework DbContext并使用.Local属性进行绑定,那么使用一个View-Model for Master / Detail情况会更有意义。

1 个答案:

答案 0 :(得分:2)

直接绑定到DbContext或其任何属性是一个坏主意,因为它会将模型暴露给View,这违反了MVVM背后的想法。 (View知道ViewModel,ViewModel知道模型)。

在主 - 详细信息场景中,您有两个不同的视图模型,每个视图模型有两个不同的视图,因为它们各自具有不同的角色。

  • 主人的角色是提供一个选择列表和一种导航到他们的详细信息的方法。
  • 另一方面,Detail的角色是呈现单个元素,可能会改变值。

想象一下,您有一个产品列表作为您的数据模型,每个产品都有一个ID,一个名称和一个价格:

class Product {
    public int Id { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
}

您还有某种数据模型,其中包含产品列表:

class ProductRepository {
    private List<Product> products = new List<Product>();
    public List<Product> Products 
    { 
        get { return this.prodcuts; }
    }
}

然后,您的MasterViewModel的角色是公开ProductRepository模型的Products列表,并提供切换到详细信息视图的方法:

class ProductsViewModel {
    private ProductRepositry productsModel = new ProductRepository();
    private ObservableCollection<Product> products = new ObservableCollection<Product>(productsModel.Products);

    public ObservableCollection<Product> Products
    {
        get { return this.products; }
    }

    public ProductViewModel Detail { get... private set... } // setter includes PropertyChange

    public ICommand ViewDetail { get... }

    public void ViewDetail(Product detail)
    {
        this.Detail = new ProductViewModel(detail);
    }
}

ProductViewModel的唯一责任是提出Product

class ProductViewModel {
    public string Name { get... set... } // Again a PropertyChange would be necessary for propert binding
    public int Price { get... set... } // dito
}