我遇到了将DataGrid的ItemsSource属性设置为LINQ查询结果的问题。确切的错误是:
无法访问已处置的对象。 对象名:'Dispose后访问的DataContext。'。
现在,在您开始窃听并提出关于延迟查询评估和处理数据库上下文的答案之前,请知道我确实理解了所有这些。我在查询结果上调用ToList()并将其分配给ItemsSource属性。所以,执行查询,结果读入内存,应该没问题。
是的,不是那么多。起初我认为必须有一些关于属性本身导致这种情况,即一些我不知道的奇怪的数据绑定事项(目前学习WPF和linq2Sql)。在考虑了更多关于它之后,我仍然无法解释问题,因为DataGrid不应该有任何DataContext的概念,只是列表(虽然从测试方法返回List并且稍后迭代它不会抛出异常)。DataContext是在销毁之后被访问的,但是这并没有帮助我理解,因为我在使用块退出之前专门调用ToList()来执行查询。但我可以解决问题,如下所示:
private void button1_Click( object sender, RoutedEventArgs e )
{
using( NorthwindDataContext db = new NorthwindDataContext() )
{
db.DeferredLoadingEnabled = false; // works, but why is it necessary at all?
grid.ItemsSource = (from o in db.Orders
where o.CustomerID == "VINET"
select o).ToList();
}
}
所以,是的,我想先了解这种行为,然后继续前进。提前谢谢。
编辑:主窗口的xaml和DataGrid
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="495" Width="722">
<Grid>
<DataGrid AutoGenerateColumns="true" Height="403" HorizontalAlignment="Left" Margin="12,41,0,0" Name="grid" VerticalAlignment="Top" Width="676" />
<Button Content="Do it" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
答案 0 :(得分:0)
您的代码表明将DeferredLoadingEnabled设置为false修复此问题?如果是这样,我假设您的数据绑定正在访问相关对象的属性,当访问该对象时,它试图触发新查询以检索所述对象。