Данных, связывающих общий объект с WPF TreeView? - PullRequest
1 голос
/ 20 июля 2011

У меня есть XML-файл, который я десериализовал в объект, и теперь я хочу отобразить этот объект в WPF TreeView.Я просматривал привязки данных с помощью WPF TreeView, но не смог найти то, что искал.

Есть ли способ заставить WPF TreeView отображать объект, и его дети не знают взаранее, как выглядит структура объекта?

Ответы [ 3 ]

1 голос
/ 20 июля 2011

Предполагается, что ваш объект выглядит примерно так:

    Entity A
        Entity B
            Entity C
            Entity C
        Entity B
    Entity D

Создайте шаблон иерархических данных для каждой неконечной сущности и шаблон данных для каждой конечной сущности.

Я нашел это простымдля размещения любого типа смешанной иерархии, если у вас есть объекты ObservableCollection (называемые чем-то вроде Items) на каждом уровне, который содержит дочерние элементы любого типа ниже него.

При такой настройке шаблоны будут выглядеть примерно так:

        <!-- entity a-->
        <HierarchicalDataTemplate DataType="{x:Type local:EntityA}" ItemsSource="{Binding Items, Mode=OneWay}">
            <StackPanel>
              <!-- your content >
            </StackPanel>
        </HierarchicalDataTemplate>
        <!-- entity b -->
        <HierarchicalDataTemplate DataType="{x:Type local:EntityB}" ItemsSource="{Binding Items, Mode=OneWay}">
            <StackPanel>
              <!-- your content >
            </StackPanel>
        </HierarchicalDataTemplate>
        <!-- entity c -->
        <DataTemplate DataType="{x:Type local:EntityC}">
            <StackPanel>
              <!-- your content >
            </StackPanel>
        </DataTemplate>
        <!-- entity d -->
        <DataTemplate DataType="{x:Type local:EntityD}">
            <StackPanel>
              <!-- your content >
            </StackPanel>
        </DataTemplate>

И привязка к древовидному представлению:

    <TreeView ItemsSource="{Binding Items, Mode=OneWay}" />

Этот ответ предполагает, что вы знаете типы объектов, с которыми имеете дело, но хотите обрабатывать любую структуру / иерархию этих объектови если вы не знаете, будет ли конкретный тип объекта листовым или нет, вы всегда можете использовать иерархические шаблоны данных.

1 голос
/ 20 июля 2011

Вы должны предоставить иерархические шаблоны данных для всех возможных типов.

0 голосов
/ 06 января 2015

Я не знаю, что вы найдете чистое решение для привязки данных, которое позволяет игнорировать объекты, но, учитывая, что вы изначально десериализованы из XML, вы, вероятно, можете сериализоваться обратно в XML. Учитывая, что это так, вы можете отобразить данные сериализации XML в древовидном элементе управления:

http://support.microsoft.com/kb/308063

Из статьи:

В файле Form1.vb замените весь код после раздела «Код, сгенерированный конструктором форм Windows» следующим примером кода:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      ' Initialize the controls and the form.
      Label1.Text = "File Path"
      Label1.SetBounds(8, 8, 50, 20)
      TextBox1.Text = Application.StartupPath() & "\Sample.xml"
      TextBox1.SetBounds(64, 8, 256, 20)
      Button1.Text = "Populate the TreeView with XML"
      Button1.SetBounds(8, 40, 200, 20)
      Me.Text = "TreeView control from XML"
      Me.Width = 336
      Me.Height = 368
      TreeView1.SetBounds(8, 72, 312, 264)
   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Try
         ' SECTION 1. Create a DOM Document and load the XML data into it.
         Dim dom As New XmlDocument()
         dom.Load(TextBox1.Text)

         ' SECTION 2. Initialize the treeview control.
         TreeView1.Nodes.Clear()
         TreeView1.Nodes.Add(New TreeNode(dom.DocumentElement.Name))
         Dim tNode As New TreeNode()
         tNode = TreeView1.Nodes(0)

         ' SECTION 3. Populate the TreeView with the DOM nodes.
         AddNode(dom.DocumentElement, tNode)
         TreeView1.ExpandAll()

      Catch xmlEx As XmlException
         MessageBox.Show(xmlEx.Message)
      Catch ex As Exception
         MessageBox.Show(ex.Message)
      End Try

   End Sub

   Private Sub AddNode(ByRef inXmlNode As XmlNode, ByRef inTreeNode As TreeNode)
      Dim xNode As XmlNode
      Dim tNode As TreeNode
      Dim nodeList As XmlNodeList
      Dim i As Long

      ' Loop through the XML nodes until the leaf is reached.
      ' Add the nodes to the TreeView during the looping process.
      If inXmlNode.HasChildNodes() Then
         nodeList = inXmlNode.ChildNodes
         For i = 0 To nodeList.Count - 1
            xNode = inXmlNode.ChildNodes(i)
            inTreeNode.Nodes.Add(New TreeNode(xNode.Name))
            tNode = inTreeNode.Nodes(i)
            AddNode(xNode, tNode)
         Next
      Else
         ' Here you need to pull the data from the XmlNode based on the
         ' type of node, whether attribute values are required, and so forth.
         inTreeNode.Text = (inXmlNode.OuterXml).Trim
      End If
   End Sub

В статье также подробно описано, как ограничить отображаемые данные:

' SECTION 4. Create a new TreeView Node with only the child nodes.
         Dim nodelist As XmlNodeList = dom.SelectNodes("//child")
         Dim cDom As New XmlDocument()
         cDom.LoadXml("<children></children>")
         Dim node As XmlNode
         For Each node In nodelist
            Dim newElem As XmlNode = cDom.CreateNode(XmlNodeType.Element, node.Name, node.LocalName)
            newElem.InnerText = node.InnerText
            cDom.DocumentElement.AppendChild(newElem)
         Next

         TreeView1.Nodes.Add(New TreeNode(cDom.DocumentElement.Name))
         tNode = TreeView1.Nodes(1)
         AddNode(cDom.DocumentElement, tNode)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...