我看过一些代码示例,它们基本上为 Master 创建了一个 View-Model,并为 Details 创建了一个 View-Model。然后他们将 Master 连接到带有 DataGrid 的 View ,然后将 Master View-Model 的选定项绑定(bind)到 ObservableObject(of DetailViewModel) 类型的 SelectedItem 属性,然后将其发送到 Detail View-Model,即然后绑定(bind)到详细 View ...如推荐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 属性进行绑定(bind),那么将一个 View 模型用于主/细节情况会更有意义。
最佳答案
直接绑定(bind)到 DbContext 或其任何属性将是一个坏主意,因为它会将模型暴露给 View ,这违反了 MVVM 背后的想法。 (View 知道 ViewModel,ViewModel 知道 Model)。
在主从场景中,您有两个不同的 View 模型,每个 View 模型具有 2 个不同的 View ,因为它们各自具有不同的角色。
假设您有一个产品列表作为数据模型,每个产品都有一个 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 的作用是公开
Products
ProductRepository 模型的列表并提供一种切换到详细 View 的方法: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
}
关于entity-framework - 带有 EF DbContext 延迟加载的 MVVM 主/详细 View - 多个 ViewModel,或全部在一个 VM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11836005/