我见过几个基本上为Master创建View-Model的代码示例,以及一个View-Model for the Details。然后,他们使用DataGrid将Master连接到View,然后将Master View-Model的选定项绑定到ObservableObject(DetailViewModel)类型的SelectedItem属性,然后将其发送到Detail View-Model,这是然后绑定到详细视图......例如推荐here。或类似this
之类的东西这.. 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情况会更有意义。
答案 0 :(得分:2)
直接绑定到DbContext或其任何属性是一个坏主意,因为它会将模型暴露给View,这违反了MVVM背后的想法。 (View知道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
}