您的问题非常广泛,但您可能希望首先确定您的 ViewModel 将如何获取其数据并通过 EF 类提交其更新。
虽然您可以将您的 EF 类型直接绑定到您的视图,但我发现更好的方法是尽可能将您的 ViewModel 与 ORM 模型类型分开。除 EF 类型外,根据行为 (ICommands) 和数据(ViewModel 道具或子 ViewModel 道具或 ObservableObjects)对视图的需求进行建模。
然后创建一个可以在 ViewModel 中注入或实例化的服务类型,它将直接与数据模型交互并将 ViewModel 转换为数据模型,反之亦然。您可以使用 LINQ/Lambda 手动完成这项工作,也可以使用 AutoMapper 之类的工具来定义 ViewModel 和数据模型(EF 类型)之间的关系。这在数据模式和 ViewModel 之间保持了清晰的界限,我认为您会发现数据模型中的更改对您的应用程序的连锁反应较小。
我称为“服务类型”的那个中间层可能只是某种类型,它比存储库公开更高级别的接口,更多地关注业务操作而不是 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 的实现。因此,快速而肮脏的方法可能会奏效,但如果您可以尝试通过以明确设计的类型呈现数据来将数据模型从 ViewModel 中抽象出来,以满足视图的需求。