我有一个用MVVM的实现编写的WPF应用程序。 MVVM模式没有额外的框架。EF类实体应保存在哪个类中?
来自EF db的实体首先被包装在它们自己的视图模型中,并且我有一个modelcontroller将它们从“窗口”视图模型加载到它们的视图模型中。实体视图模型的
例子:
public class MainViewModel: ViewModels.ViewModelBase
{
private IModelController modelController = new ModelController();
private List<PurchaseOrderViewModel> _poList;
public List<PurchaseOrderViewModel> POList
{
get
{
return _poList;
}
set
{
_poList = value;
OnPropertyChanged();
}
}
// ...
// Other Properties
// ...
public MainViewModel()
{
POList = modelController.GetPurchaseOrders();
}
}
ModelController的例子:
public class ModelController : IModelController
{
public List<PurchaseOrderViewModel> GetPurchaseOrders()
{
using (var model = new DBContext())
{
return model.purchaseorders
.Select(new PurchaseOrderViewModel { /* assign properties */ })
.ToList();
}
}
}
我应该在哪里保存该包裹的视图模型的窗口视图模型的
public class PurchaseOrderViewModel : ViewModels.ViewModelBase
{
private someType _prop;
public someType Prop
{
get
{
return _prop;
}
set
{
_prop = value;
OnPropertyChanged();
}
}
// ...
// Other Properties
// ...
public PurchaseOrderViewModel() {
// default constructor for LINQ
}
public PurchaseOrderViewModel(purchaseorder entity)
{
// load values from entity in properties
}
}
例(PurchaseOrderViewModel)一旦用户完成编辑?正如我所看到的,有两种选择:
- 在每个viewmodel中创建一个保存函数,该函数指向modelController,但这种感觉像是一种不恰当的方法。
- 创建于modelcontroller保存功能,并通过视图模型作为参数
这很可能是我失踪的MVVM模式的东西,但请点我在正确的方向。谢谢!
编辑:我从所提供的信息中排除了视图(MainView),但该视图直接绑定到由MainViewModel公开的属性。
选项1最接近,不合适。但是你并没有充分使用MVVM。您应该将虚拟机建立在视图(用例)上,而不是模型上。 –
如果我正确理解你在说什么,那么我想我已经这样做了。我的MainView直接绑定到MainViewModel的属性。我没有包含这些信息,因为我认为这与问题无关。 – MichelMichels
不,我的意思是ViewModels不应该太紧密地遵循Models类。他们的名字应该来自你设计的屏幕。 –