Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
首先将WPF数据绑定到datagrid和实体框架数据库_Wpf_Visual Studio 2010_Entity Framework_Data Binding_Wpfdatagrid - Fatal编程技术网

首先将WPF数据绑定到datagrid和实体框架数据库

首先将WPF数据绑定到datagrid和实体框架数据库,wpf,visual-studio-2010,entity-framework,data-binding,wpfdatagrid,Wpf,Visual Studio 2010,Entity Framework,Data Binding,Wpfdatagrid,使用数据库优先的方法,我在我的wpf项目中创建了实体(使用实体框架),所以我有了edmx文件 从MSDN: EF使用T4模板从模型生成代码。VisualStudio附带的或从VisualStudio库下载的模板用于一般用途。这意味着从这些模板生成的实体具有简单的ICollection属性。但是,在使用WPF进行数据绑定时,希望对集合属性使用ObservableCollection,以便WPF可以跟踪对集合所做的更改。为此,我们将修改模板以使用ObservableCollection 因此,我遵循

使用数据库优先的方法,我在我的wpf项目中创建了实体(使用实体框架),所以我有了edmx文件

从MSDN: EF使用T4模板从模型生成代码。VisualStudio附带的或从VisualStudio库下载的模板用于一般用途。这意味着从这些模板生成的实体具有简单的ICollection属性。但是,在使用WPF进行数据绑定时,希望对集合属性使用ObservableCollection,以便WPF可以跟踪对集合所做的更改。为此,我们将修改模板以使用ObservableCollection

因此,我遵循本教程将实体更改为具有ObservableCollection属性: (更新数据绑定的代码生成部分)

在Visual Studio的WPF视图(在xaml文件中)中,我添加了一个DataGrid并添加了以下代码:

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
   using (SIEntities siContext = new SIEntities())
   {
      var query = from p in siContext.Customers
                  select p;

      dataGrid.ItemsSource = query.ToList();
    }
}
首先,为了了解如何插入数据,我想从代码中在数据库中插入一个新客户,因此我有以下方法:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
   using (SIEntities siContext = new SIEntities())
   {
         Customer cust1 = new Customers();
         cust1.Name = "Pippo";
         cust1.City = "London";
         siContext.Customers.Add(cust1);
         siContext.SaveChanges();
         dataGrid.Items.Refresh();
    }
 }
通过这段代码,我可以在数据库中插入新行,但在datagrid中看不到这一新行

在xaml文件中,我为datagird提供了以下内容:

<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="43,65,0,0" VerticalAlignment="Top" Height="234" Width="423"/>

为什么??没有绑定到实体的数据网格? 如何显示数据库中添加的新行以及datagrid中的新行


谢谢

我会将您使用WPF的方法更改为使用MVVM设计模式。你可以阅读更多关于这个的信息

DataGrid已绑定到查询结果。使用您正在使用的方法,您需要重新查询数据库并将ItemsSource重置为返回的结果。因此,按照您的模式,您需要进行以下更改:

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
   RefreshCustomers();
}

private void RefreshCustomers()
{
   using (SIEntities siContext = new SIEntities())
   {
      var query = from p in siContext.Customers
                  select p;

      dataGrid.ItemsSource = query.ToList();
    }
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
   using (SIEntities siContext = new SIEntities())
   {
         Customer cust1 = new Customers();
         cust1.Name = "Pippo";
         cust1.City = "London";
         siContext.Customers.Add(cust1);
         siContext.SaveChanges();
    }

    RefreshCustomers();
}

问题。为什么不创建一个公共
客户
变量,它是
列表
的列表,将
数据网格
源绑定到该列表,然后在
按钮上单击\u 1
只需将新客户添加到
列表
变量并刷新数据网格源?这样你就不必每次都查询了。是的,你也可以这样做。如果您要这样做,您可能只需要转到完整的MVVM,这是我在第一段中建议的。