0

我对 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()

....一切,包括新行,都是功能性的。任何帮助或指示将不胜感激。再次,我对此很陌生,我意识到这可能是我整个设计的问题。谢谢。

4

2 回答 2

0

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

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

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

于 2013-05-08T20:46:10.153 回答
0

Linq query results are read-only, if you want to be able to add items to your data source you may need to supply your own class as Source which enumerates your results (IEnumerable) and also supplies methods to manipulate the data source (IList).

于 2013-05-08T17:31:19.060 回答