【问题标题】:Binding Entity Framework results from View Model to View将实体框架结果从视图模型绑定到视图
【发布时间】:2020-04-15 23:55:16
【问题描述】:

我目前的视图中有一个 Datagrid (ProductView.xaml),如下所示:

DataGrid x:Name="myDataGrid" x:FieldModifier="public" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="No MAT" Binding="{Binding MATProductNumber}" Width="0.1*"/>
            <DataGridTextColumn Header="Format" Binding="{Binding tblFormat.FormatName}" Width="0.1*"/>
            <DataGridTextColumn Header="Nom produit" Binding="{Binding tblProduct.ProductName}" Width="0.1*"/>
</DataGrid.Columns>

由于我仍然熟悉 WPF 和 C#,我仍然不能 100% 适应 MVVM 模式。 我设法通过在我的 productView.xaml.cs 中插入此代码来将数据绑定到我的 Datagrid:

public ProductListView()
    {
        InitializeComponent();
        LoadProducts();
    }

private void LoadProducts()
    {
        myDataGrid.ItemsSource = db.tblMATProduct.Include(s => s.tblGrade).Include(s => s.tblProduct).Include(s => s.tblFormat).Take(15).ToList();
    }

在这里,我将 myDataGrid 的 itemsSource 设置为 代码隐藏 中的 Entity Framework 查询的结果。

但是,我读到最好在 View Model 文件中实现它。

因此,我现在已在代码隐藏中将数据上下文绑定到我的视图模型,并将其添加到我的 ViewModel 类中

public ProductListViewModel()
    {
        ProductsList = new List<tblMATProduct>(db.tblMATProduct.Include(s => s.tblGrade).Include(s => s.tblProduct).Include(s => s.tblFormat).Take(15).ToList());
    }

public List<tblMATProduct> ProductsList { get; }

并且还修改了我的Datagrid

DataGrid x:Name="myDataGrid" ItemsSource="{Binding DataContext.ProductsList}" x:FieldModifier="public" AutoGenerateColumns="False">

但看起来它没有绑定数据。

有谁知道为什么这个逻辑不正确?

提前致谢!

【问题讨论】:

  • "myDataGrid 的 itemsSource...result...Entity Framework...code-behind 已经读到最好在 View Model 文件中实现它" -不完全的。虽然 MVVM 确实说最好在视图模型 (VM) 中公开集合并让视图 (V) 绑定到它,但它没有说明集合是如何填充的。即 MVVM 不关心 EF。您可能想要创建一个执行 EF 工作的服务。然后可以将此类服务注入您的 VM,并在加载期间让 VM 调用该服务以通过 EF 加载模型。
  • @RandyQuackers:删除“DataContext”。从绑定路径。
  • 这就是问题@mm8。非常感谢!

标签: c# .net wpf entity-framework mvvm


【解决方案1】:

如果在加载窗口后已经完成了DataContext的绑定,那么Binding时就不需要指定DataContext了。

DataContext Binding 必须是您的 ViewModel 对象。因此,您可以直接访问 ProductList。只需按照以下代码即可。

DataGrid x:Name="myDataGrid" ItemsSource="{Binding ProductsList}" x:FieldModifier="public" AutoGenerateColumns="False">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2012-07-03
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多