WPF MVVM绑定。相同的视图,不同的对象

时间:2013-12-07 11:06:12

标签: c# wpf linq mvvm

我正在构建我的第一个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; }
    }
}    

1 个答案:

答案 0 :(得分:0)

根据您的解释,我可以理解数据结构:

  • 设计视图(符合最终用户的要求)
  • 设计一个容纳视图的ViewModel
  • 为您的存储库/数据访问类提供每个linq查询的方法,以查询正确的数据结构并返回ViewModel的实例

MVVM中的ViewModel负责弥合View和ViewModel之间的差距。如果生成的Views和ViewModel相同,则几乎没有理由制作多个版本(除非新的见解提示您这样做)

通过调用模型上的方法/访问属性并提供可供Views使用的属性和命令来完成桥接。这样,ViewModel只知道Model并允许Views访问数据和操作。

ViewModel不知道View意味着ViewModel对View没有依赖关系。反过来,View将依赖于ViewModel,因为它将指向ViewModel的属性和命令。