直接绑定到 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 的作用是公开Products
ProductRepository 模型的列表并提供一种切换到详细视图的方法:
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
}