entity-framework - 带有 EF DbContext 延迟加载的 MVVM 主/详细 View - 多个 ViewModel,或全部在一个 VM 中

标签 entity-framework mvvm dbcontext

我看过一些代码示例,它们基本上为 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 ,因为它们各自具有不同的角色。

  • 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 的作用是公开 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/

    相关文章:

    .net - Entity Framework 'An item cannot be removed from a fixed size Array of type *[]'

    c# - Entity Framework 将导航属性映射为标量属性

    ios - iOS 中的 MVVM 模型

    c# - WPF 中 ViewModel 上的线程锁定

    java - Tomcat:javax.naming.NoInitialContextException

    c# - 更新并发事务 C# 的数量问题

    asp.net-mvc - 在 ASP.NET MVC 中,如何更新当前用户信息?

    c# - 将WPF与MVVM架构一起使用以创建与要轮询的设备相对应的动态GUI

    sql-server - EF ObjectQuery<T> 上下文、参数、连接属性等效于 DbSet<T>

    c# - 从 DbContext 中检索未提交的实体