WPF DataGrid / LINQ查询(DataGrid新行不可见)

时间:2013-05-08 16:50:34

标签: wpf vb.net linq

我对WPF / LINQ2Entities比较陌生。我已经设法取得了进展但我仍然坚持一个我一直在研究的问题:

1)我有一个基于此CollectionViewSource填充的WPF DataGrid。 CollectionViewSource的源代码是LINQ查询。

    Private context As New QADBEntities        
    Dim QADBEntitiesViewSource As CollectionViewSource

    Dim SalesOrderSerialNumber_Query = From salesOrders In context.tblSalesOrders
                           Join serialNumbers In context.tblSerialNumbers
                           On salesOrders.Sales_Order_ID Equals serialNumbers.Sales_Order_ID
                           Where salesOrders.Sales_Order_ID = 5
                           Select New With {salesOrders, serialNumbers}


    QADBEntitiesViewSource = CType(Me.FindResource("QADBEntitiesViewSource"), CollectionViewSource)
    QADBEntitiesViewSource.Source = SalesOrderSerialNumber_Query.ToList()

以下是DataGrid的XAML摘录:

            <DataGrid x:Name="TblSerialNumbersDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" CanUserAddRows="True"
              ItemsSource="{Binding Source={StaticResource QADBEntitiesViewSource}}" Margin="293,44,10,16" 
              RowDetailsVisibilityMode="VisibleWhenSelected" Grid.ColumnSpan="2">
              <DataGrid.Columns>
                  <DataGridTextColumn x:Name="Kit_Group_IDColumn" Binding="{Binding serialNumbers.Kit_Group_ID}" Header="Kit Group ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="NotesColumn" Binding="{Binding serialNumbers.Notes}" Header="Notes" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="Product_IDColumn" Binding="{Binding serialNumbers.Product_ID}" Header="Product ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="Production_Lead_IDColumn" Binding="{Binding serialNumbers.Production_Lead_ID}" Header="Production Lead ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="QA_Personnel_IDColumn" Binding="{Binding serialNumbers.QA_Personnel_ID}" Header="QA Personnel ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="Sales_Order_IDColumn" Binding="{Binding serialNumbers.Sales_Order_ID}" Header="Sales Order ID" Width="SizeToHeader"/>
                ....etc
              </DataGrid.Columns>
    </DataGrid>

2)问题:填充DataGrid并更改数据可以正常工作。但是, DataGrid未在网格底部显示新行以添加其他记录

我认为它与LINQ查询有关,因为当我以这种方式填充DataGrid时:

            QADBEntitiesViewSource = CType(Me.FindResource("QADBEntitiesViewSource"), CollectionViewSource)
            QADBEntitiesViewSource.Source = context.SalesOrderListSQ.ToList()

....包括新行在内的所有内容都是有效的。任何帮助或指示将非常感激。我再次对此非常陌生,我意识到这可能是我整个设计的一个问题。感谢。

2 个答案:

答案 0 :(得分:0)

Linq查询结果是只读的,如果您希望能够向数据源添加项目,则可能需要提供自己的类Source来枚举您的结果(IEnumerable)和还提供了操纵数据源的方法(IList)。

答案 1 :(得分:0)

实际上,这里的问题不是LINQtoEntities,而是网格,而是EF。 EF支持对集合中对象的更改,甚至在向表中添加行(即,向ObjectSet添加项)时更改通知,但不通过CollectionViewSource自动添加行。如果需要,可以返回DataSet,或者只创建一个“Add New”命令,该命令将新项添加到ObjectSet并使其成为CollectionViewSource的当前项。

您可以通过调用CollectionViewSource.View.Refresh来刷新CollectionViewSource,并且可以通过调用CollectionViewSource.View.MoveCurrentTo(newItem)使某个项目成为当前项目。但是,如果是对象查询,则可能必须再次运行查询,即重复行CollectionViewSource.Source = ...

我发现EF对收集视图源的支持不稳定;这在很大程度上取决于你如何获得你的实体列表支持什么和不支持什么。您的第一个代码返回一个ObjectQuery,必须再次执行才能识别对底层列表的更改,而第二个示例返回一个ObjectSet,它支持添加和删除项目以及集合更改通知,据我所知。所以,实际上我应该在第一段中看到EF支持仅在某些情况下通过CollectionViewSource添加行...