我正在构建一个MVVM应用程序。我正在尝试构建我的应用程序:
我不知道这种方法在MVVM中是否常见。无论如何,ViewModel使用服务层来填充它正在包装的Model或ObservableCollection。为了利用它的服务,ViewModel有一个包含服务抽象的字段,如下所示:
IService service;
因为我使用Linq来查询数据库,所以我的实体与我的域名具有相同的名称。为了让ViewModel不知道服务层/数据库实体,我需要服务层来返回域模型而不是Linq生成的数据库实体。我这样做是通过执行以下操作(我正在工作的一个例子):
ObservableCollection<ItemTypeViewModel> GetItemTypes()
{
DataContextLocalDB dc = new DataContextLocalDB();
ObservableCollection<ItemTypeViewModel> itemTypes = new ObservableCollection<ItemTypeViewModel>();
foreach (ItemType itemType in dc.ItemTypes)
{
Models.ItemType type = new Models.ItemType();
type.Name = itemType.Name;
type.Description = itemType.Description;
ItemTypeViewModel itemTypeViewModel = new ItemTypeViewModel(type);
itemTypes.Add(itemTypeViewModel);
}
}
有几件事我不高兴/不确定:
谢谢: - )
答案 0 :(得分:2)
没有理由重新创建Linq为您创建的数据对象。只需将它们传递给ViewModel就可以了。 看起来你似乎必须在Domain和ViewModel之间创建一个解耦,但由于这些实体只包含属性而不是逻辑,所以可以传递它们,并且它也可以更容易编程。
其他一切都非常新潮。唯一的事情是我不会使用LinqToSql,而是使用EntityFramework。看起来相同,只有L2SQL才是MS放弃的东西。
答案 1 :(得分:0)
public partial class ItemType : EntityObject //this is your Entity Model
{
public string Name{get;set;}
public string Description{get;set;}
}
您无法修改上述部分。
如果要通过viewModel扩展模型。创建另一个类
public partial class ItemType : EntityObject // this is your ViewModel class,this place on another file
{// Important: in same namespace
public void SomeMethod(){}
public ICommand CustomCommand {get{...}}
public string CustomProperty{
get{ return localVar;}
set{ localVar=value;
onPropertyChanged("CustomProperty");
}}
}
最后:
public IQueryable<ItemType> GetItemTypes{
get{
DataContextLocalDB dc = new DataContextLocalDB();
return dc.ItemTypes;
}
}