C# 使用LINQ2SQL DataContext表作为其ItemsSource时使用DataGrid的正确方法(最佳实践)

C# 使用LINQ2SQL DataContext表作为其ItemsSource时使用DataGrid的正确方法(最佳实践),c#,wpf,linq-to-sql,datagrid,C#,Wpf,Linq To Sql,Datagrid,因此,我通过构建一个简单的UI来学习Linq2SQL。我使用两个数据网格来显示主/详细信息类型界面,其中“客户”显示在一个网格中,选择后,一些详细信息显示在另一个网格中(例如,外键表中的记录,如“订单”,等等) 现在,我读到的关于使用DataGrid的每个示例都显示了如下内容: using( var db = new TestDataContext() ) { // AutoGenerateColumns set to false and // column bindings

因此,我通过构建一个简单的UI来学习Linq2SQL。我使用两个数据网格来显示主/详细信息类型界面,其中“客户”显示在一个网格中,选择后,一些详细信息显示在另一个网格中(例如,外键表中的记录,如“订单”,等等)

现在,我读到的关于使用DataGrid的每个示例都显示了如下内容:

using( var db = new TestDataContext() )
{
    // AutoGenerateColumns set to false and 
    // column bindings set to certain properties 
    // of the Customer class.
    grid.ItemsSource = db.Customers.ToList();
}
好吧,这不起作用,因为由于数据绑定,在执行此代码之后会访问DataContext,当然,Context对象已经被释放。好的,那很好;我可以为我的所有网格操作使用单个DataContext,即使DataContext类被设计为可以快速使用和处理。我不确定是否保留一个单独的DataContext会在将来对我产生影响

因此,现在我遇到了更新数据库并将这些更改反映回网格的问题。我遇到的最简单的方法是将
ItemsSource
设置为null,然后再次将其绑定到表。这让我觉得很“脏”,我不得不想象我错过了什么。理论上,我可以使用ObservableCollection并将其绑定到网格,使其与底层数据保持同步,但我还没有弄清楚如何让网格显示来自ObservableCollection的数据(我将其绑定到XAML中,在表中只呈现空行)

TLDR:


所以不管怎样,我的问题是:;对于这种类型的场景,您有经验的LINQ2SQL人员使用什么模式?似乎我能找到的所有例子都过于简单化了,并且不太适用于现实世界的用例(即使是像我这样简单的一个)。基本上,如何使用DataContext,如何在向表中添加新项时保持网格的更新,以及这里有哪些一般最佳做法?

在您提供的示例代码中,只有绑定到延迟加载的属性时,绑定才会再次访问DataContext。 您看过datacontext上的LoadOptions.LoadWith()函数了吗(假设自上次查看linqtosql以来它还没有被重命名)


就我个人而言,我掌握datacontext并将其保留在页面生命周期中没有问题,尽管在整个应用程序生命周期中没有一个单独的datacontext。

不要使用单一的
datacontext
!如果你坚持下去,问题就会接踵而至。我希望我知道的足够多,能够准确地解释原因和内容,然而我所能断言的只是经验——它已经崩溃了,至少在网络世界中是如此(这里不再详细说明)。你在哪个花园玩?这是我想的,但如果我想使用DataGrid,我看不到其他选择。这是我的问题:)。该应用程序本身是WPF,非网络。感谢您指出
LoadWith
,我不知道这一点。这是一个桌面应用程序,因此没有“页面寿命”,只有应用程序寿命。关于网格更新问题有什么想法吗?我现在所做的感觉像是一种解决方法,我假设有更好的方法来保持每个网格的最新状态。ObservableCollection是唯一一种让它们在添加或删除行时自动更新的方法。不确定为什么会得到空行,XAML中的绑定表达式一定有问题。是的,我必须再看一看。绑定本身很简单:
ItemsSource=“{binding Customers}”
,其中Customers是一个可观察的集合。当我设置属性时,我得到n个空行,其中n对应于集合中的元素数。因此,行被添加,它们只是空的。不知道为什么列表可以正常工作。