Как получить элементы из дерева WPF узла? - PullRequest
0 голосов
/ 10 сентября 2010

TreeView:

   -MainNode
      -node0
          data01
          -data02
             data021
             data022
          data03
      -node1
          data11
      -node2
          data21

Событие SelectedChange;

Как выбрать узел, содержащий дочерние узлы, для получения окончательных данных?

Например: выбранный узел узел0 получает данные (данные01, данные021, данные022, данные03)

Ответы [ 4 ]

3 голосов
/ 10 сентября 2010

Я предполагаю, что вы, что это: При щелчке узлов верхнего уровня (узел0, узел1, узел2) я хочу получить все дочерние узлы данных в дереве.

Если это то, что вам нужно, вот код:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TreeView x:Name="myTreeView" Height="271" HorizontalAlignment="Left" Margin="47,12,0,0" VerticalAlignment="Top" Width="236" SelectedItemChanged="myTreeView_SelectedItemChanged">
        <TreeViewItem Header="node0" >
            <TreeViewItem Header="data01" />
            <TreeViewItem Header="data02" >
                <TreeViewItem Header="data021" />
                <TreeViewItem Header="data022" />
            </TreeViewItem>
            <TreeViewItem Header="data03" />
        </TreeViewItem>
        <TreeViewItem Header="node1" >
            <TreeViewItem Header="data11" />
        </TreeViewItem>
        <TreeViewItem Header="node2" >
            <TreeViewItem Header="data21" />
        </TreeViewItem>
    </TreeView>
</Grid>
</Window>

И код CS для обработки события SelectedItemChanged будет выглядеть следующим образом

    private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        foreach (TreeViewItem dataNode in ((TreeViewItem)e.NewValue).Items)
        {
            TraverseChildrenData(dataNode);
        }
    }

    public void TraverseChildrenData(TreeViewItem treeViewItem)
    {
        //do whatever you want to do with child data item here..   
        MessageBox.Show(treeViewItem.Header.ToString());

        foreach (TreeViewItem child in treeViewItem.Items)
        {
            TraverseChildrenData(child);
        }
    }
1 голос
/ 10 сентября 2010

Чтобы получить IEnumerable из структуры узла, я нашел эту статью действительно полезной

http://www.claassen.net/geek/blog/2009/06/searching-tree-of-objects-with-linq.html

Он использует методы расширения, и вы получаете все товары повторного использования и отложенного выполнения.*

Пример использования:

IEnumerable<XmlElement> nodes = treeViewItem.AsBreadthFirstEnumerable(x => x.ChildNodes);
1 голос
/ 10 сентября 2010

Я бы использовал простую рекурсию, чтобы получить то, что вы хотите.Псевдокод ниже:

личный список recursive_method (Node selectedNode) {

List<Node> data = new List<Node>();

foreach(child in nodelist.Children) {
    data.add(child);
    List<Node> children = recursive_method(child);
    if(children != null) data.addRange(children);
}

return data;

}

0 голосов
/ 10 сентября 2010

Вот измененная версия моего предыдущего ответа.Этот использует TreeSource ItemsView для привязки данных

XML-данные:

<data>
  <datanode Header="node0" >
    <datanode Header="data01" />
    <datanode Header="data02" >
      <datanode Header="data021" />
      <datanode Header="data022" />
    </datanode>
    <datanode Header="data03" />
  </datanode>
  <datanode Header="node1" >
    <datanode Header="data11" />
  </datanode>
  <datanode Header="node2" >
    <datanode Header="data21" />
  </datanode>
</data>

XAML:

<Grid>
    <Grid.DataContext>
        <XmlDataProvider Source="Data.xml" XPath="/data/datanode" />
    </Grid.DataContext>
    <TreeView x:Name="myTreeView" Height="271" HorizontalAlignment="Left" Margin="47,12,0,0" VerticalAlignment="Top" Width="236" SelectedItemChanged="myTreeView_SelectedItemChanged" ItemsSource="{Binding}" >
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding}" >
                    <TextBlock Text="{Binding XPath=@Header}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Grid>

CS:

    private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        foreach (XmlElement dataNode in ((XmlElement)e.NewValue).ChildNodes)
        {
            TraverseChildrenData(dataNode);
        }
    }

    public void TraverseChildrenData(XmlElement treeViewItem)
    {
        //do whatever you want to do with child data item here..   
        MessageBox.Show(treeViewItem.Attributes["Header"].Value);

        foreach (XmlElement child in treeViewItem.ChildNodes)
        {
            TraverseChildrenData(child);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...