c# - 在 C# WPF 中使用 Linq-to-SQL 将嵌套的 ListView 数据绑定(bind)到 ObservableCollection

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

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

上下文:

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

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

最初,我开发了一个类,它定义了一个嵌套的 ObservableCollection(类/ ListView 中的数据多于它的嵌套集合 - 但我们现在忽略它!)。

然后我:

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

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

然后我:

  • 发现了 Linq-To-SQL
  • 删除了我的 SQL 数据库类
  • 删除了我的 ObservableCollection 类
  • 继续删除 - 横冲直撞,这将在未来几年被我的程序变量记住。

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

当我目睹 designer.cs 的内容时,我感到震惊 - 一个完美建模的结构完美地代表了我的两个表,我不得不惊叹不已。

然后我:

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

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

问题:

但是,每个项目的嵌套 ListView 都是空的!

然后,我:

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

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

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

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

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

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

非常感谢。

最佳答案

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

Person.ClubsAndSocieties

然后您可以用通常的方式绑定(bind)到这个属性。

检查它虽然你可能会发现它只是空的,如果你把它带回来的原始查询是这样的:

var myPeople = ObjectContext.People;

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

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

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

取决于您的 EF 版本。

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

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

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

关于c# - 在 C# WPF 中使用 Linq-to-SQL 将嵌套的 ListView 数据绑定(bind)到 ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669089/

相关文章:

c# - Enterprise Library Logging 5 - 滚动平面文件

c# - 如何在 C# 中以编程方式创建 WPF 可滚动 StackPanel 列表

c# - 如何处理动态放置标签的重叠

c# - WPF 枚举数据绑定(bind)

wpf - 在 WPF XAML 中缩放复杂的 SVG 路径

c# - 在 C# Unity 中获取实时视频流

c# - 协变分配不起作用

c# - 线程锁定与创建新对象

wpf - FormattedText 类中的下标/上标?

c# - 我无法让 ToggleSwitch 控件出现在我的 Windows Phone 应用程序中