使用Entity Framework在WPF中将数据绑定到数据网格。

7
我在网上找了很多资料都没有解决我的问题。
我创建了一个模型,并将其作为对象添加到数据源中。我以为它会像数据集一样运行,只需将其拖放到表单上即可绑定数据。但是,当我从模型拖放时,它显示为空白。因此,我上网查找并发现需要一些代码才能实现,但我已经尝试了这个方法,仍然是空白的。有什么想法我做错了什么吗?
   public partial class form1: Window

{
    ComEntities context;;
    public form1()
    {
        InitializeComponent();

    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        context = new ComEntities();

        System.Windows.Data.CollectionViewSource comEntitiesViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("comEntitiesViewSource")));


        var permits = (from c in context.tBLPER.Local select c);

        this.DataContext = context.tBLPER.Local;
        tBLPERDataGrid.ItemsSource = context.tBLPER.Local;

    }


}

XAML:

 <DataGrid x:Name="tBLPERDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Margin="10,10,10,413" ItemsSource="{Binding}" EnableRowVirtualization="True" AutoGenerateColumns="False">

    </DataGrid>
4个回答

7
你需要将查询结果实现化(将数据读入内存)。你可以调用ToList()方法来实现,但更好的方法是这样做:
 context.TBLPER.Load();  
 this.DataContext = context.TBLPER.Local;  // set the Window DataContext property

The Local属性获取一个ObservableCollection<T>,表示此集合中所有AddedUnchangedModified实体的本地视图。随着实体被添加或从上下文中删除,该本地视图将保持同步。同样,添加到本地视图或从本地视图中删除的实体将自动添加或删除到上下文中。
如果您需要在之前过滤数据(假设您的实体有一个名为Age的属性,并且想要年龄大于20岁的用户),则可以执行以下操作:
 context.TBLPER.Where(t=>t.Age>20).Load();  
 this.DataContext = context.TBLPER.Local; 

另外一件事,如果你想在窗口的代码后台设置网格(Grid)的ItemSource属性,那么在xaml代码中创建该属性的绑定就没有意义了,因此请删除它:

<DataGrid ... ItemsSource="{Binding}" ...>

如果你想要做这件事情:
tBLPERDataGrid.ItemsSource=context.TBLPER.Local;

感谢提供的信息,我有点困惑应该在哪里添加代码来实现查询。我尝试过在window_Loaded和public Form1()下添加代码,但当我输入CEntities以加载表时,我只能选择Equals和ReferenceEquals这两个选项。 - Gisiota
没关系,谢谢你的帮助。我感觉很愚蠢,现在数据网格显示了字段类型(例如日期选择器和文本框,在此之前都是空白的),但数据仍然不存在。我认为这与我的查询有关,我从未在任何地方使用变量许可证,也不确定如何绑定它,如果我正在使用context.tblper.local方法。我已更新我的window_loaded代码,其中包含我目前拥有的内容。 - Gisiota
你确定那个表里有数据吗?有两件事情需要注意,第一,你没有调用 Load() 方法;第二,你不必同时设置 DataContextItemSource,只需选择其中一个即可。如果你选择设置网格的 ItemSource,那么请从你的 XAML 代码中删除 ItemsSource="{Binding}" - ocuenca
感谢您的所有帮助!我没有加载。我需要在代码中引用它(使用project.model)。我想仅使用XAML绑定此数据,您有推荐的文献或网站吗? - Gisiota
+1000!在(EF7 / EF Core)中没有Load(),但是ToList()可以工作。感谢您包含筛选器示例,这正是我所需要的! - Chuck Savage

1

不应该两次设置ItemsSource(只需在代码后台设置-删除ItemsSource="{Binding}")。

同时,你应该设置 AutoGenerateColumns="True",因为如果没有它,则需要向DataGrid添加DataGridColumn元素。

在这里查看更多细节... http://www.wpf-tutorial.com/datagrid-control/custom-columns/

你可能还想在tBLPERDataGrid.ItemsSource = permits;行上设置断点,以便检查permits以确认它包含了你期望的数据。


0
如果您想使用模型(同时ItemsSource="{Binding}"是一个提示,说明您想要),那么不要硬编码ItemsSource。您应该在CEntities context;变量中创建模型对象,但是您应该将其设置为窗口的DataContext属性,如下所示:
DataContext = new CEntities();

并删除该行

tBLPERDataGrid.ItemsSource = permits;

现在的ItemsSource来自于CEntities实例。


0
如果您将AutoGenerateColumns设置为“False”,则应在XAML中提供列定义或将AutoGenerateColumns设置为“True”。这是要做的第一件事。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接