【问题标题】:Data Binding a Nested ListView to an ObservableCollection using Linq-to-SQL in C# WPF在 C# WPF 中使用 Linq-to-SQL 将嵌套 ListView 绑定到 ObservableCollection 的数据
【发布时间】:2014-03-26 17:46:51
【问题描述】:

我的具体问题背后有大量代码,因此我将尝试了解我想要实现的目标背后的方法,而不是提供/请求任何编码示例。话虽如此,我将在以后发布并接受尽可能多的代码以达到这种理解水平 - 我们会看看这是怎么回事!

背景:

我开发了一个嵌套列表视图。那是一个 ListView,它在每个 ListViewItem 中包含另一个 ListView(如果您愿意,可以使用一点 List-View-Ception)。

Upper Listview需要包含一张表的数据,而Nested Listview需要包含相关表的数据(外键链接)

最初,我开发了一个定义嵌套 ObservableCollection 的类(类/列表视图中的数据比它的嵌套集合更多 - 但我们现在将忽略这一点!)。

然后:

  • 使用我的 SQL 数据库类填充 ObservableCollection 并带有一个看起来很吸引人的循环
  • 用另一个看起来很吸引人的循环填充每个嵌套集合;手动从相关表中选择正确的数据
  • 将我的 Listview 的 DataContext 设置为 Collection
  • 最后将 XAML 中的绑定值设置为与我的可观察集合类的公共名称相同

问题已解决。问题已回答。非常感谢。

然后:

  • 发现 Linq-To-SQL
  • 删除了我的 SQL 数据库类
  • 删除了我的 ObservableCollection 类
  • 继续删除暴行,我的程序变量将在未来几年内记住它。

所以,我创建了 Linq-to-SQL 类,连接到我的数据库并将表拖到提供的界面中。

当我看到 Designer.cs 的内容时,我惊呆了 - 一个完美建模的结构,完美地代表了我的两张桌子,我不得不惊叹不已。

然后:

  • 创建了一个继承 ObservableCollection(我的数据库中的表)的新类
  • 在我的新类的构造函数中放置一个 foreach 循环来填充集合
  • 创建了这个类的第一个对象,发送一个 Linq-to-Sql 类的数据上下文对象(AKA:在我的表中创建数据的集合)
  • 重命名我的绑定路径值以匹配我数据库中列的值
  • 删除了我键盘上的 F5 键

Listview 包含数据 - 不得不说,这个系统给我留下了深刻的印象。

问题:

但是,每个项目的嵌套列表视图都是空的!

那么,我:

  • 检查了数据库;第二个表包含数据,与外键正确链接
  • 在 Designer.cs 中注意到嵌套数据将存储在 EntitySet 中
  • 调试并检查 ObservableCollection

我找到了数据,并对 Linq-To-SQL 类根据外键值将第二个表数据正确地分隔到每个集合项印象深刻。事实上,我印象非常深刻。

但是,我不知道如何绑定这些值并让它们显示!他们在这里(调试中):

- TheDataContextObject[N-Item]->TheNestedEntitySet->non-public members->entities->[The List of Nested Data for that Item]

该实体集中的数据是正确的 - 我只是不明白如何绑定到这些值。

感谢所有帮助 - 随着时间的推移,我将努力提高问题的总体质量,并将接受所有建议。

非常感谢。

【问题讨论】:

  • 探索实体框架,请^-^。哦,还有 MVVM。
  • @StefanDenchev - 很高兴。您能否向我提供一个推荐的链接,我不太可能在我即将进行的谷歌搜索中找到...谢谢。
  • 当然,here 的 MVVM,您可以在复数视觉查看 Julie Lerman 的教程..

标签: c# wpf xaml listview linq-to-sql


【解决方案1】:

您的实体类将您的“外键”类作为导航属性。您可以像访问任何其他 C# 属性一样访问这些属性。例如,Person 类/对象可能与另一个EntitySetClubsAndSocieties 类/对象有关系。 C# 明智的做法是这样访问它:

Person.ClubsAndSocieties

然后您可以以通常的方式绑定到该属性。

检查它虽然您可能会发现它只是空值,但如果您将其带回的原始查询是这样的:

var myPeople = ObjectContext.People;

这是默认加载。如果您想恢复实体的特定导航属性,那么您需要像这样恢复您的实体:

var myPeople = ObjectContext.People.Include("ClubsAndSocieties");

var myPeople = ObjectContext.People.Include(()=>ClubsAndSocieties);

取决于您的 EF 版本。

您可以继续链接这些包含以带回您感兴趣的所有导航属性。因此,如果 Person 还具有指向 FamilyMembers 的链接,那么带回整个图表的查询将如下所示:

var myPeople = ObjectContext.People.Include("ClubsAndSocieties").Include("FamilyMembers";

正如 Stefan 所说,您最好发现 Entity Framework(linq to sql 是一个正确方向的开始)和 MVVM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多