【问题标题】:Binding to TreeView and DataGrid绑定到 TreeView 和 DataGrid
【发布时间】: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&lt;T2ViewModel&gt; T2Items { get; set; } } 这样的类更方便、更容易。
  • “这是一个 MVVM 应用程序,所以代码隐藏不是一个选项”:你应该把它从你的脑海中解脱出来...... MVVM 并不意味着“没有代码隐藏”。有时代码隐藏做某事的正确位置(尽管在这种情况下可能不是)
  • 我希望我能给你一个额外的点,因为你问“应该进入 DataGrid 的 ItemsSource 以实现这一点?”这是唯一真正帮助我解决特定 TreeView/Entity Framework 绑定问题的问题/答案。非常非常感谢!

标签: wpf data-binding


【解决方案1】:

你试过了吗?

<DataGrid ItemsSource="{Binding SelectedItem.T1ToT2, ElementName=theTreeView}" />

【讨论】:

  • 啊,成功了!谢谢!是的,我知道,我不应该对代码隐藏和 MVVM 过于教条。我还将尝试 vorrtex 的建议并将数据集转换为 ObservableCollection/Properties。
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2012-11-25
  • 1970-01-01
  • 2016-06-17
  • 2011-07-06
相关资源
最近更新 更多