【问题标题】:Get logical path from treeview which has HierarchicalDataTemplate从具有 HierarchicalDataTemplate 的树视图中获取逻辑路径
【发布时间】:2010-04-23 13:01:04
【问题描述】:

我有一个地理对象的结构:

Country
Areas,
Provinces,
Cities
and Hotels

国家有地区,地区有省,省有市,城市有酒店。 当我点击城市节点时,我想获得逻辑路径,例如:法国,普罗旺斯,SomeProvince,蒙彼利埃,大酒店。

每个类都有字段:名称、代码和 listOf...

Treeview 效果很好,但这种方法不行:

 private void structureTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
if (structureTree.SelectedItem is Hotel)
            {
                objectCode = ((Hotel)structureTree.SelectedItem).Code;
                TreeViewItem item = e.OriginalSource as TreeViewItem;
                DependencyObject parent = VisualTreeHelper.GetParent(item);
                dlgEditHotel(objectCode, structureTree.Parent.ToString());
            }
          }

`**structureTree.SelectedItem as TreeViewItem **`

当我点击某个地区、省、市或酒店时,给我 null

【问题讨论】:

    标签: c# wpf treeview


    【解决方案1】:

    您可以将树项目的名称存储在它们的标签或某处, 并在 SelectedItemChanged 递归遍历树直到最顶层的项目并构建路径字符串。

    【讨论】:

    • 是的,但是如果用户从另一个节点和不同类型的项目中单击项目...例如。我的路径字符串看起来像 France,Provanse,SomeProvince ,他会点击德国/拜仁(这个节点之前已经展开过)??
    • 这不会改变事情 - 你仍然需要从最低的项目构建路径(点击“bayern” -> 拜仁的 parent 节点是“germany”,你会建立一个字符串 "germany\bayern"
    • 这就是我想要的! :) 但是当我点击拜仁时如何获得德国??
    • 您需要创建一个接受 SelectedItem 的函数,它会以 SelectedItem 的父项作为参数递归调用自身并传递构建的路径字符串。阅读递归函数,你一定会明白的。
    • 好的,我知道,但是从父级获取值名称的代码是什么??
    【解决方案2】:

    您可以读取每个 TreeviewItem 的 DataContext 属性并获取项目(国家、地区、省份、城市等)。读取名称(例如)并在遍历树时递归地附加到路径字符串中。

    【讨论】:

      【解决方案3】:

      我创建了一个树视图如下:

      <TreeView Name="tree">
                  <TreeViewItem Header="Country" Selected="GetName">
                      <TreeViewItem Header="Areas" Selected="GetName">
                          <TreeViewItem Header="Provinces" Selected="GetName">
                              <TreeViewItem Header="Cities" Selected="GetName">
                                  <TreeViewItem Header="Hotels" Selected="GetName">
                                  </TreeViewItem>
                              </TreeViewItem>
                          </TreeViewItem>
                      </TreeViewItem>
      
                  </TreeViewItem>
      
              </TreeView>
      

      现在 GetName 方法会做这样的事情:

      private void GetName(object sender, RoutedEventArgs e)
              {
                  TreeViewItem item = (TreeViewItem)sender;
                  name = item.Header + "." + name;
                  if (!(item.Parent is TreeViewItem))
                  {
                      MessageBox.Show(name);
                  }
      
              }
      

      最后 MessageBox 将显示名称为

      Country.Areas.Provinces.Cities.Hotels.

      我希望这是你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 2016-05-15
        • 2013-06-01
        • 2017-08-08
        • 1970-01-01
        相关资源
        最近更新 更多