【问题标题】:how to convert a list of models to an collection of modelVM-s?如何将模型列表转换为 modelVM-s 的集合?
【发布时间】:2019-03-01 19:21:27
【问题描述】:

我对 MVVM 和实体框架比较陌生。

到目前为止,我让我的实体模型实现了 INotifyPorpertyChanged 接口,然后在 WindowVM 类中,我使用从数据库加载的模型对象填充了一个 ObservableCollection,并使用 Linq 查询,并将我在 xaml 中的数据绑定到这个列表(或列表框中的选定项目,其中 itemsource 设置为此集合)。

但我在几个网站和博客上读到这是一种不好的做法,因为我将我的模型直接暴露给视图,并且我必须使用与视图直接相关的逻辑来污染我的模型(例如 IsSelected 属性设置为 [未映射])。

据我所知,更好的方法是创建一个 ViewModel 类来扭曲模型类。

但是我应该如何将模型列表(由 linq 查询返回)转换为 modelVM-s 的集合?

【问题讨论】:

  • 对于BlahModel,写一个BlahViewModel 类。给BlahViewModel 一个构造函数BlahViewModel(BlahModel model)——让构造函数做它需要做的任何事情。给父视图模型一个公共属性ObservableCollection<BlahViewModel> Blahs {/*INPC stuff*/}。然后在父视图模型中,Blahs = new ObservableCollection<BlahViewModel>(blahModelQuery.Select(m => new BlahViewModel(m)));
  • 您应该为 Views 编写 ViewModels,而不是为模型编写。 SelectedItem 属于 VM,在 M 中没有位置。但在 Occasion 中,如果要准确显示 Model,只需通过它即可。
  • +1 @HenkHolterman 视图需要数据,它的需求定义了 ViewModel。 ViewModel 将包含来自多个模型实体的数据,以及来自管理用户与应用程序交互的当前状态的任何模型实体的数据(例如 IsSelected 属性)。
  • 大家可以看图here

标签: c# wpf entity-framework mvvm


【解决方案1】:

@EdPlunkett 谢谢!我怎么没想到? (我现在感觉很愚蠢)

只是轻微的修改:

Blahs = new ObservableCollection<BlahViewModel>(
                  blahModelQuery.Select(m => new BlahViewModel(m))
        );

这将引发 System.NotSupportedException:

“LINQ to Entities 中仅支持无参数构造函数和初始化程序。”

Blahs = new ObservableCollection<BlahViewModel>(
                  blahModelQuery.Select(m => new BlahViewModel(){model = m})
        );

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多