【发布时间】:2011-02-15 04:48:47
【问题描述】:
我在将 DataGrid 的 ItemsSource 属性设置为 LINQ 查询的结果时遇到问题。确切的错误是:
无法访问已处置的对象。 对象名称:'Dispose 后访问的 DataContext。'。
现在,在您开始窃笑并提出有关延迟查询评估和处理数据库上下文的答案之前,请知道我确实了解所有这些。我在查询结果上调用 ToList() 并将其分配给 ItemsSource 属性。所以,查询执行,结果读入内存,应该没问题。
是的,没那么多。起初我认为一定是属性本身导致了这种情况,即一些我不知道的奇怪的数据绑定事情(目前正在学习 WPF 和 linq2Sql)。在考虑了更多之后,我仍然无法解释这个问题,因为 DataGrid 不应该有任何 DataContext 的概念,只有列表(尽管从测试方法返回一个列表并稍后迭代它并没有引发异常)。
这是在销毁后访问的 DataContext,但这也无助于我理解,因为我专门调用 ToList() 来在 using 块退出之前执行查询。但是,我可以解决如下所示的问题:
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();
}
}
所以是的,我想在继续之前了解这种行为。提前致谢。
编辑:主窗口和 DataGrid 的 xaml
<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>
【问题讨论】:
标签: c# wpf linq-to-sql datagrid