c# - 在 MVVM 中,使用 Entity Framework,什么填充了 View 模型?

标签 c# wpf entity-framework mvvm

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

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

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

最佳答案

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

this.DataContext = new TheViewModelType();

Entity Framework 普通旧 CLR 对象是数据模型, View 通常不应该知道这些。 View 模型可能具有 View 可以绑定(bind)到的模型类型的属性,例如 Items 控件等。所以在 View 中:

<ItemsControl x:Name="CarItems" ItemsSource="{Binding Vm.CarsCollection}"></ItemsControl>

因此,由于 View 的 DataContext 是 View 模型类型的实例,因此 View 控件可以直接绑定(bind)到 View 模型中的属性。该示例是具有 Cars 集合的 View 模型,并且 View 模型可以在需要填充 Cars 集合时调用服务。显然 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");
        }
    }

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

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

关于c# - 在 MVVM 中,使用 Entity Framework,什么填充了 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36225810/

相关文章:

c# - 如何从 C# 连接英特尔的新 DRNG(RDRAND 指令)?

javascript - 在 mvc JavaScript 中加载下拉更改选择的列

c# - 图像的分离和分析

C# 通用存储库 - 工作单元 - 线程安全

c# - Mercurial,使用 .NET api 编写 Hook

c# - WPF 中排队事件的最佳实践

c# - 将 ElementHost 的大小调整为托管的 XAML UserControl 的大小

c# - 将项目添加到可观察集合导致 Collection View 异常

c# - 如何模拟 Entity Framework 6 异步方法?

c# - 使用 Linq 从两个表中获取数据