【问题标题】:Linq To Sql and WPF : DeferredLoadingEnabled = false and DataBindingLinq To Sql 和 WPF:DeferredLoadingEnabled = false 和 DataBinding
【发布时间】:2009-11-06 05:16:03
【问题描述】:

在使用全局 Linq to Sql DataContext 并进行不需要的插入后,我决定使用分离的方法。我通过一个方法类来做到这一点,该类充当从我的业务对象到我的 DAL 的抽象层。每个 CRUD 调用都有一个 DataContext,所以我可以这样调用。

using (DatabaseMethods<TEntity> db = new DatabaseMethods<TEntity>())
{
    return db.GetAll();
}

在 DatabaseMethods 构造函数中,我创建了一个新的 DataContext。 在 DatabaseMethods.Dispose() 中,我处理上下文,并将其设置为 null。

DatabaseMethods 中的GetAll 使用dataContext 获取列表:

return this.dataContext.GetTable<TEntity>().ToList();

问题是当我绑定到实体时,我的组合框被填充(它们由类似的 getAll 调用填充),但未显示 selectedItem。 (例如:Gun 具有 GunType(由外键链接)),但同一页面上的网格(绑定到同一对象)显示该项目的文本。难道是WPF不知道如何比较两者,知道它们是一样的?我的单元测试测试我的 DatabaseMethods 显示加载正确发生。

我已经尝试为我的所有 DataContexts 关闭 DeferredLoadingEnabled 并使用 LoadWith 函数在加载时获取描述符,但当 UI 第一次抓取它时它仍然必须为空。似乎 UI 必须尝试获取该属性一次,然后才能第二次工作。调试时加载属性(通过 LoadWith 设置)。

这是一个非常具体的问题,我一直在寻找关于我的问题的线索。如果有人有一些建议,我将不胜感激。

编辑:答案是覆盖 Equals。输入问题帮助我弄清楚了。然后我刷新了这个页面,看到了 Michael Petito 的回答。

【问题讨论】:

    标签: wpf linq-to-sql data-binding


    【解决方案1】:

    您在 DatabaseMethods 类的每个实例中使用不同的数据上下文。由您的第一个数据上下文加载的用于检索您的 Gun 的 GunType 实例将与您的第二个数据上下文加载的用于填充您的组合框的等效 GunType 实例不同。

    由于两个 GunType 是不同的实例,它们将不相等,并且您将无法在组合框中获得正确的选定项,除非您显式覆盖 GunType 类从 Object 继承的 Equals 方法。

    例如:

    public override bool Equals(object other)
    {
        return other is GunType && ID == ((GunType)other).ID;
    }
    

    【讨论】:

    • 感谢您的快速回复。在刷新此页面并看到您的答案之前几分钟,我自己刚刚得出了这个结论。覆盖等于后,所选项目再次工作!
    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2011-01-27
    • 2010-09-16
    相关资源
    最近更新 更多