【问题标题】:Trouble with deferred evaluation and DataGrid.ItemsSource延迟评估和 DataGrid.ItemsSource 的问题
【发布时间】: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


    【解决方案1】:

    您的代码表明将 DeferredLoadingEnabled 设置为 false 解决了这个问题?如果是这样,我会假设您的数据绑定正在访问相关对象的属性,该对象在访问时试图触发新查询以检索所述对象。

    【讨论】:

    • 当数据绑定访问相关对象上的属性时(例如引用了 OrderType 对象的订单对象),延迟加载启动,新查询启动
    • 请为您的数据网格发布 XAML - 希望这样可以轻松发现问题
    • 好的,xaml 已启动。谢谢你,因为你把我带到了我唯一改变的地方; AutoGeneratesColumns 属性。将其设置为 false 就可以了。
    • 显然这意味着我必须手动创建所有列并设置它们的绑定,除非我想在 DataGrid 的生命周期中保留上下文。挺可惜的,也许我能找到更好的办法。
    • 您几乎总是希望手动创建所有列,否则您的所有主键、外键等最终都会显示在网格中。我认为我从来没有绑定到一个网格,我可以在其中自动生成我的所有列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2011-03-03
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多