如何使用最有效的方式向WPF提供这些功能来解决数百个POCO模型的问题,而无需实现INotifyPropertyChanged和其他WPF内容?
现在,我将EntityFramework与简单的POCO类和手写的ViewModels一起使用。
我的架构如下所示:
- 视图
- 视图模型
- 存储库模式
- WCF 存储库或数据库存储库
- 业务逻辑
- 实体框架
- POCO 模型类
我对此的想法是:
- 使用自动映射器将 POCO 类映射到视图模型类,在此之前手动创建这些视图模型。
- 使用 T4 作为在 POCO 类之前生成的包装生成基本 ViewModels,编写我自己的(或使用现有解决方案)的实例解析程序类以在 EF 中提供相同的功能(一个实例 = 数据库中的一条记录)。
我很困惑,因为我不喜欢自己的解决方案,它现在不稳定,但自动映射器在映射中使用反射。
怎么办?您是否知道一些非常棒的、非常棒的工具来完成这种神奇的事情,并让我灵活地添加和扩展 ViewModel?
你假设:
- 通常,您可以在视图模型中创建模型对象的副本
- 通常你在视图模型的每个对象中实现INotifyPropertyChanged
我认为这两种假设都是错误的。请看下面的代码示例:
class Customer
{
public int ID {get; set;}
public string Name {get; set;}
}
class MyViewModel: INotifyPropertyChanged
{
// Hook you repository (model) anyway you like (Singletons, Dependency Injection, etc)
// For this sample I'm just crating a new one
MyRepository repo = new MyRepository();
public List<Customer> Customers
{
get { return repo.Customers;}
}
public void ReadCustomers()
{
repo.ReadCustomers();
InternalPropertyChanged("Customers");
}
public event PropertyChangedEventHandler PropertyChanged;
protected void InternalPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
class MyRepository
{
private List<Customer> customers;
public List<Customer> Customers
{
get { return customers; }
}
public void ReadCustomers()
{
// db is the Entity Framework Context
// In the real word I would use a separate DAL object
customers = db.Customers.ToList();
}
}
客户是实体框架返回的列表。ViewModel 属性"客户"是指向"模型"属性的简单直通属性。
在此示例中,我不在客户内部使用 INotifyPropertyChanged。我知道客户列表只有在用户调用 ReadCustomers() 时才能修改,所以在其中我调用 PropertyChanged。
如果我需要为 Customer 类触发 PropertyChanged 通知,我会直接在 Customer 类上实现 INotifyPropertyChanged。