1

我看过一些代码示例,它们基本上为 Master 创建了一个 View-Model,并为 Details 创建了一个 View-Model。然后他们将 Master 连接到带有 DataGrid 的视图,然后将 Master View-Model 的选定项绑定到 ObservableObject(DetailViewModel)类型的 SelectedItem 属性,然后将其发送到 Detail View-Model,即然后绑定到详细视图...如推荐here或类似的东西

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

这..一个模型实体,多个页面->多个视图?多个视图模型?

还有这个......与单个视图关联的多个 ViewModel

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

在我看来,如果您使用实体框架 DbContext 并且正在使用 .Local 属性进行绑定,那么将一个视图模型用于主/细节情况会更有意义。

4

1 回答 1

2

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

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

  • Master 的角色是提供选择列表和导航到其详细信息的方法。
  • 另一方面,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 的作用是公开ProductsProductRepository 模型的列表并提供一种切换到详细视图的方法:

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
}
于 2012-12-17T14:53:41.717 回答