在 MVVM 中,使用实体框架,什么填充视图模型?

Rya*_*yan 4 c# wpf entity-framework mvvm

我正在编写一个 WPF 桌面应用程序。我正在尝试了解 MVVM 数据流。我使用实体框架作为数据访问,并且使用代码优先方法,因此我有代表每个 SQL 表的 POCO 实体类。

通过此配置,我的理解是我的模型(MVVM 中的 M)是我的 POCO 实体类。我的视图(MVVM 中的 V)是我的 WPF 窗口。

我的视图模型中填充了什么?我是否只在视图中进行 EF 查询,填充视图模型?我的视图模型是否执行自己的查询(也许在类构造函数内)?

Sim*_*erT 5

通常,视图是一个 WPF 窗口及其相应的隐藏代码。视图模型是一个简单的类,创建它是为了处理特定视图的数据层要求并进行处理。在控件的 XAML 视图中使用命令是很常见的,并且每个命令都绑定到视图模型中的一个命令实例。视图模型可以通过依赖注入创建,也可以传递到视图代码后面的构造函数中,并作为成员/属性存储在后面的代码中。确保将视图数据上下文设置为视图模型的实例,以便允许绑定到视图模型中的属性和命令。

this.DataContext = new TheViewModelType();
Run Code Online (Sandbox Code Playgroud)

实体框架普通旧 CLR 对象是数据模型,视图通常不应该知道这些。视图模型可能具有视图可以绑定到的模型类型的属性,例如项目控件等。所以在看来:

<ItemsControl x:Name="CarItems" ItemsSource="{Binding Vm.CarsCollection}"></ItemsControl>
Run Code Online (Sandbox Code Playgroud)

因此,由于视图的 DataContext 是视图模型类型的实例,因此视图控件可以直接绑定到视图模型中的属性。该示例是具有汽车集合的视图模型,并且视图模型可以在需要填充汽车集合时调用服务。显然 a Car 是模型。

    public MyViewModel( )
    {
        Cars = TheCarsDataLayerService.GetCars( );
    }

    private IObservable<Car> _cars;

    public IObservable<Car> Cars
    {
        get { return _cars; }
        set
        {
            if( _cars == value )
                return;
            _cars = value;
            RasisePropertyChanged("Cars");
        }
    }
Run Code Online (Sandbox Code Playgroud)

对于示例中的 Cars 服务,这可能是数据层存储库,也可能是实体框架 DbContext 的实例。因此,视图模型可以具有 DbContext 派生类型的字段或此类服务,并且可以将其传递到视图模型类的构造函数中或通过依赖项注入进行注入,或者该服务可能是视图模型的静态工厂或单例只需调用视图将要向用户显示的数据来填充其成员。

MVVM 是一种非常基本的设计模式,可以通过多种不同的方式实现。一些开发人员会将模式提升到新的高度,并严格遵守模式组件通信的许多规则。最终,无论如何实现,使用该模式都比根本不使用任何模式要好得多,因为它将使代码能够更好地扩展,并且其他开发人员可能更容易理解代码并期望某些事情。此外,MVVM 模式允许 WPF 开发人员进行单元测试。如果做得足够好,就可以测试视图模型,并且由于视图代码后面没有代码,并且视图除了显示它甚至不知道的数据之外不执行任何操作,因此测试视图模型就足够了。