全新的WPF应用程序,MVVM,以及如何使用从ADO实体数据模型生成的POCO特殊类..



我以前问过这个问题,但实际上我仍然需要帮助。。。

这是一个场景:

我正在启动一个新的WPF应用程序,并希望使用MVVM。因为我们的DBA已经创建了一个包含需要执行CRUD操作的表的数据库,所以我使用了数据库优先的方法(ADO.NET实体数据模型功能),并为我创建了.edmx、.tt、dbcontext分部类等。

现在,MVVM方法的发展方向是什么?我不想使用框架,在使用外部工具之前,我想先了解MVVM的基本知识。有什么教程可以帮助我入门吗?

很抱歉再次问这个问题,但我真的找不到任何帮助,我不得不使用我们DBA创建的东西。

您的问题确实很宽泛,但您可能想从决定ViewModels如何通过EF类获取数据和提交更新开始。

虽然您可以将EF类型直接绑定到视图,但我发现更好的方法是尽可能将ViewModels与ORM模型类型分开。根据EF类型之外的行为(ICommands)和数据(ViewModel道具或子ViewModel道具或者ObservableObjects)对视图的需求进行建模。

然后创建一个可以在ViewModel中注入或实例化的服务类型,该服务类型将直接与数据模型交互,并将ViewModel转换为数据模型,反之亦然。您可以使用LINQ/Lambdas手动完成这项工作,也可以使用AutoMapper之类的工具来定义ViewModels和数据模型(EF类型)之间的关系。这在数据模式和ViewModels之间保持了清晰的界限,我想你会发现数据模型中的变化对你的应用程序的连锁反应较小。

我称之为"服务类型"的中间层可能只是某种类型,它暴露了比存储库更高级别的接口,存储库更专注于业务操作,而不是crud操作,但在内部代表视图模型进行所有存储库或EF调用。

如果你想避免使用一个很好的框架,但你仍然应该下载MVVM Light核心库,看看其中包含的内容。它非常瘦,将为您提供支持MVVM的基本螺母和螺栓。如果你愿意,你可以选择在那之后自己滚动,但这可能不值得。

编辑:既然你说你时间不够。。。虽然我不鼓励这样做,但一个更方便但不太健壮的解决方案可能是将视图直接绑定到EF类型,作为ViewModels的属性。

//使用MVVM Light中包含的ViewModelBase//它为您提供了特殊的Set()方法

公共类EditCustomerViewModel:ViewModelBase{

public EditCustomerViewModel(){
     _currentCustomerCommand = new RelayCommand(SaveCustomer);
}
private Customer _currentCustomer;
private void SaveCustomer(){
     using(var ctx = new EfDataContext()){
        // Save operation here
     }
}
public Customer CurrentCustomer{
     get { return _currentCustomer; }
     set { Set(()=>CurrentCustomer, ref _currentCustomer, value); }
}
public ICommand SaveCustomerCommand{ get { return _saveCustomerCommand;}}

}

然后,在您的视图中,您可以将控件绑定到CurrentCustomer属性,无论它们是什么。您可以通过命令进行EF保存,该命令在此处显示为MVVM Light RelayCommand的实现。因此,快速而肮脏的方法可能会起作用,但如果您可以尝试通过以显式编制的类型来呈现数据来满足视图的需求,从而将数据模型从ViewModels中抽象出来。

最新更新