我正在构建一个MVVM应用程序。我试图像这样构造我的应用程序:

我不知道这种方法在MVVM中是否常见。无论如何,ViewModel使用服务层来填充它正在包装的模型或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);
}
}有几件事我不高兴/不确定:
谢谢:-)
发布于 2011-04-03 08:24:25
没有理由重新创建Linq为您创建的数据对象。把它们传递给ViewModel,你会没事的。您可能需要在域和ViewModel之间创建一个解耦,但是由于这些实体只包含属性,而不包含逻辑,所以传递它们是可以的,而且编程也非常容易。
其他的东西都是最新的。唯一的一件事是我不会使用LinqToSql,而是使用EntityFramework。看起来完全一样,只有L2SQL是一件被女士抛弃的事情。
发布于 2011-04-03 08:28:15
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;
}
}https://stackoverflow.com/questions/5528427
复制相似问题