2012-08-06 28 views
1

我见过几个代码示例,主要为Master创建视图模型,为View创建Details模型。然后,他们将Master连接到具有DataGrid的View,然后Master View-Model的选定项目绑定到ObservableObject(DetailViewModel)类型的SelectedItem属性,然后将其发送到Detail View-Model,即然后绑定到详细视图...如建议here。或者类似的东西this使用EF DbContext的MVVM主/明细视图懒加载 - 多个ViewModels或全部在一个虚拟机中

看完这个... 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

我很困惑:)好像首选棱镜方式这样做的目的是让主模块和细节模块拥有一个独立的ViewModel,在我的理由中,我觉得这样做会有很多工作要做。

在我看来,如果您使用实体框架DbContext并正在使用.Local属性进行绑定,那么使用一个View/Model作为主/细节情况会更有意义。

回答

2

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

在主细节场景中,您有两个不同的视图模型,每个视图模型有两个不同的视图,因为它们每个都有不同的角色。

  • 硕士的作用是呈现选择列表和导航到他们的细节的方法。
  • 细节的作用另一方面是呈现一个单一的元素,可能有一种方法来改变值。

想象一下,你有产品的列表,你的数据模型,每个产品都有一个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 
} 
+0

EF的。当地财产是一个ObservableCollection,我提供了一些起点集合,我的虚拟机获得的我的视图连接到我的虚拟机中的一些ObsvCol,然后为详细视图,我使用虚拟机的ObsvCol中的对象的导航属性。这是问题的一部分,EF的大部分信息都是针对无状态设计的Web,而提供的.Local属性MS使用长寿DbContexts让位于桌面上的有状态设计。生活,学习和重新考虑;) – GetFuzzy 2012-12-22 07:39:03

相关问题