WPF 中的实体框架 POCO 类和视图模型



如何使用最有效的方式向WPF提供这些功能来解决数百个POCO模型的问题,而无需实现INotifyPropertyChanged和其他WPF内容?

现在,我将EntityFramework与简单的POCO类和手写的ViewModels一起使用。

我的架构如下所示:

  • 视图
  • 视图模型
  • 存储库模式
  • WCF 存储库或数据库存储库
  • 业务逻辑
  • 实体框架
  • POCO 模型类

我对此的想法是:

  1. 使用自动映射器POCO 类映射到视图模型类,在此之前手动创建这些视图模型
  2. 使用 T4 作为在 POCO 类之前生成的包装生成基本 ViewModels,编写我自己的(或使用现有解决方案)的实例解析程序类以在 EF 中提供相同的功能(一个实例 = 数据库中的一条记录)。

我很困惑,因为我不喜欢自己的解决方案,它现在不稳定,但自动映射器在映射中使用反射

怎么办?您是否知道一些非常棒的、非常棒的工具来完成这种神奇的事情,并让我灵活地添加和扩展 ViewModel?

我相信

你假设:

  1. 通常,您可以在视图模型中创建模型对象的副本
  2. 通常你在视图模型的每个对象中实现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。

相关内容

  • 没有找到相关文章

最新更新