【发布时间】:2011-12-18 04:48:34
【问题描述】:
我对 WPF 很陌生,遇到了一个我无法解决的问题。 有一个包含两个表 T1 和 T2 的数据集。 T1 有这样的递归结构
T1Id
父 ID
名称
还有这种关系:
ds.Relations.Add("RecursiveRel",
tables["T1"].Columns["T1Id"],
tables["T1"].Columns["ParentId"]);
我通过将它绑定到 DataView 来在 TreeView 中显示此表:
DvT1 = ds.Tables[0].DefaultView;
DvT1.RowFilter = string.Format("Id = '{0}'", IdOfFirstRecord);
在 XAML 中:
<TreeView ItemsSource="{Binding DvT1}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding RecursiveRel}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
这可以正常工作,并在树视图中很好地显示层次结构。
现在表 T2 开始发挥作用,它具有以下结构:
T2Id T1Id 名称
T1 和 T2 之间存在 1:n 关系,其中 n >= 0。已将关系添加到 DataSet:
ds.Relations.Add("T1ToT2",
tables["T1"].Columns["T1Id"],
tables["T2"].Columns["T1Id"]);
T2 正在使用 DataGrid,它应该只显示链接到当前选定的 T1 记录的记录。 应该进入 DataGrid 的 ItemsSource 以实现这一点?我还没有找到任何可以做到这一点的东西。 如果这很重要,我还应该注意到,这是一个 MVVM 应用程序,所以代码隐藏不是一个选项。
非常感谢任何帮助。
【问题讨论】:
-
如果是MVVM应用,为什么要用这些奇怪的表和关系呢?建议将所有模型转换为视图模型,并使用真实属性和可观察集合而不是数据集和其他动态视图。
-
这是我从远程系统(非 Microsoft)接收数据的方式。为什么这些表很奇怪?因为T1的递归结构?
-
因为字符串文字和方括号。一开始最好为每个数据模型创建视图模型,因为绑定到像
class T1ViewModel { public ObservableCollection<T2ViewModel> T2Items { get; set; } }这样的类更方便、更容易。 -
“这是一个 MVVM 应用程序,所以代码隐藏不是一个选项”:你应该把它从你的脑海中解脱出来...... MVVM 并不意味着“没有代码隐藏”。有时代码隐藏是做某事的正确位置(尽管在这种情况下可能不是)
-
我希望我能给你一个额外的点,因为你问“应该进入 DataGrid 的 ItemsSource 以实现这一点?”这是唯一真正帮助我解决特定 TreeView/Entity Framework 绑定问题的问题/答案。非常非常感谢!
标签: wpf data-binding