我正在构建我的第一个WPF应用程序,并且正在努力遵循MVVM原则。
我有一种情况,我使用我的viewModel从我的实体构建一个对象,使用LINQ分布在8个不同的数据库表中,准备填充树视图。
这很好。
我现在需要做的是更改绑定到相同视图的对象。例如,在简单的情况下,对象可能具有不同的顺序,或者更重要的是,我可以过滤实体的源,这将需要完全不同的查询连接其他表,但最终结果对象将是用于绑定到的相同结构我的树视图。
这是我的主要方法:
public EntityViewModel()
{
using (var model = _app.OrmContext.CreateUnitOfWork())
{
// get unique entity names, we always need this in the filtering drop-down
var names = (
from tt
in model.EntityTypes
.OrderBy(o => o.Name)
select new EntityType
{
Name = tt.Name
}).Distinct().ToList();
_entityNamesUnique.AddRange(names);
var collection =
from n
in names
select new EntityCollection
{
entityName = n.Name,
tags = (
from t in model.Entities
join to in model.EntityOutlines on t.Outline equals to
where t.EntityType.Name.Equals(n.Name)
orderby to.EntityData
select new EntityMeta
{
entityData = to.CData,
objectId = to.ObjectId,
completed = t.Completed,
modified = (DateTime) to.Modified, // no idea why I need to cast this
comment = t.EntityType.Comment
}
).Distinct().ToList(),
};
_entityCollection.AddRange(collection);
}
}
我的问题是如何使用MVVM实现这一目标?我已经看到了主视图模型和子视图模型的示例,其中页面可能被交换,或者视图中的控件被动态更改。在我的情况下,视图没有改变 - 相同的页面,相同的控制 - 但我正在改变我将要显示的数据。
我目前的想法是,我在视图模型类中有一个单独的私有查询方法,用于我发回的数据的每个变体,并且我在主视图模型方法中切换以决定要返回的数据。
我很确定这会起作用,但这是MVVM方式吗?
为了清晰起见,修改。
最终对象将是相同的。我的代码中指示的结构中的实体分组。但是核心实体与当前未包含在该视图中的其他业务对象有关系(此查询只显示所有内容),因此我需要切换运行的查询 - 比如说 - 显示按关系A或B或C分组的实体结构。在每种情况下,LINQ查询都会非常不同,从而进一步链接(数据库)实体关系层次结构。
因此,在每种情况下得到的linq查询都会有很大的不同,每个查询都有一个单独的方法,然后在我的视图模型方法中将其切换为在MVVM中处理的合法方式吗?
进一步修改代码。
我还不完全熟悉MVVM的说法,所以也许这个伪代码可以帮助说明我在做什么。这看起来合情合理吗?
class EntityViewModel {
public EntityViewModel()
{
switch (someEvent)
{
case 1:
buildAllEntityCollection();
break;
case 2:
buildEntitiesGroupedByADifferentObjectA();
break;
case 3:
buildEntitiesGroupedByDifferentObjectsBAndC();
break;
}
}
private void buildAllEntityCollection()
{
// the LINQ query already posted, adds the results of a
//linq query to a list of EntityCollections
// that is bound to the view
var collection = some.Linq.query.Tolist();
_entityCollection.AddRange(collection);
}
private void buildEntitiesGroupedByADifferentObjectA()
{
// a completely different LINQ query populating
// the same list, binding to the same view
var collection = some.Linq.query.Tolist();
_entityCollection.AddRange(collection);
}
private void buildEntitiesGroupedByDifferentObjectsBAndC()
{
// a completely different LINQ query populating
// the same list, binding to the same view
var collection = some.Linq.query.Tolist();
_entityCollection.AddRange(collection);
}
List<EntityCollection> EntityCollection
{
get { return _entityCollection; }
}
}
答案 0 :(得分:0)
根据您的解释,我可以理解数据结构:
MVVM中的ViewModel负责弥合View和ViewModel之间的差距。如果生成的Views和ViewModel相同,则几乎没有理由制作多个版本(除非新的见解提示您这样做)
通过调用模型上的方法/访问属性并提供可供Views使用的属性和命令来完成桥接。这样,ViewModel只知道Model并允许Views访问数据和操作。
ViewModel不知道View意味着ViewModel对View没有依赖关系。反过来,View将依赖于ViewModel,因为它将指向ViewModel的属性和命令。