我的具体问题背后有大量代码,因此我将尝试理解我试图实现的目标背后的方法,而不是提供/请求任何编码示例。话虽如此,我将在此后发布并接受尽可能多的代码,以达到这种理解水平 - 我们将拭目以待!
上下文:
我开发了一个嵌套的 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/