WPF TreeView show WCF config file

Install-Package CommunityToolkit.mvvm
[ObservableObject]
public partial class XmlConfigNode
{
    [ObservableProperty]
    private string nodeName;

    [ObservableProperty]
    private string nodeValue;

    [ObservableProperty]
    private bool isHaveValue;

    [ObservableProperty]
    private ObservableCollection<XmlConfigNode> children=new ObservableCollection<XmlConfigNode>();
}

 

public class XmlConfigParser
{
    public static ObservableCollection<XmlConfigNode> LoadXmlConfig(XmlDocument xmlDoc)
    {
        var xmlNodesCollection = new ObservableCollection<XmlConfigNode>();
        var rootElem = xmlDoc.DocumentElement;
        if (rootElem != null)
        {
            var rootItem = CreateElementNodeRecursive(rootElem);
            xmlNodesCollection.Add(rootItem);
        }
        return xmlNodesCollection;
    }

    public static XmlConfigNode CreateElementNodeRecursive(XmlElement elem)
    {
        var item = new XmlConfigNode()
        {
            NodeName = elem.Name,
            IsHaveValue = false
        };

        foreach (XmlAttribute attr in elem.Attributes)
        {
            item.Children.Add(new XmlConfigNode()
            {
                NodeName = attr.Name,
                NodeValue = attr.Value,
                IsHaveValue = true
            });
        }

        foreach (XmlNode childNode in elem.ChildNodes)
        {
            if (childNode is XmlElement childElem)
            {
                item.Children.Add(CreateElementNodeRecursive(childElem));
            }
        }
        return item;
    }
}

 

 

 

<Window x:Class="WpfApp15.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp15"
        mc:Ignorable="d"
        Title="Tree View Hierachical Data Template" WindowState="Maximized">
    <Window.DataContext>
        <local:MainVM/>
    </Window.DataContext>

    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>

        <HierarchicalDataTemplate x:Key="ConfigTreeViewItemTemplate"
                                  DataType="{x:Type local:XmlConfigNode}"
                                  ItemsSource="{Binding Children}">
            <Grid>
                <Grid.Resources>
                    <Style TargetType="TextBlock">
                        <Setter Property="FontSize" Value="20"/>
                    </Style>
                </Grid.Resources>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding NodeName}"/>
                <TextBlock Grid.Column="1" Text="=" Visibility="{Binding IsHaveValue,Converter={StaticResource BooleanToVisibilityConverter}}"/>
                <TextBlock Grid.Column="2" Text="{Binding NodeValue}" Visibility="{Binding IsHaveValue,Converter={StaticResource BooleanToVisibilityConverter}}"/>
            </Grid>
        </HierarchicalDataTemplate>

        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="True"/>
        </Style>
    </Window.Resources>
    <Grid>
        <TreeView ItemsSource="{Binding ConfigCollection}"
                  ItemTemplate="{StaticResource ConfigTreeViewItemTemplate}">
        </TreeView>
    </Grid>
</Window>


using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace WpfApp15
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }


    [ObservableObject]
    public partial class MainVM
    {
        public MainVM()
        {
            ReadXml();
        }

        private void ReadXml()
        {
            string xmlFile = @"../../../Web.config";
            if (!File.Exists(xmlFile))
            {
                return;
            }

            string xmlStr = File.ReadAllText(xmlFile);
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xmlStr);
            ConfigCollection = new ObservableCollection<XmlConfigNode>(XmlConfigParser.LoadXmlConfig(xmlDoc));
        }



        [ObservableProperty]
        private ObservableCollection<XmlConfigNode> configCollection;
    }

    public class XmlConfigParser
    {
        public static ObservableCollection<XmlConfigNode> LoadXmlConfig(XmlDocument xmlDoc)
        {
            var xmlNodesCollection = new ObservableCollection<XmlConfigNode>();
            var rootElem = xmlDoc.DocumentElement;
            if (rootElem != null)
            {
                var rootItem = CreateElementNodeRecursive(rootElem);
                xmlNodesCollection.Add(rootItem);
            }
            return xmlNodesCollection;
        }

        public static XmlConfigNode CreateElementNodeRecursive(XmlElement elem)
        {
            var item = new XmlConfigNode()
            {
                NodeName = elem.Name,
                IsHaveValue = false
            };

            foreach (XmlAttribute attr in elem.Attributes)
            {
                item.Children.Add(new XmlConfigNode()
                {
                    NodeName = attr.Name,
                    NodeValue = attr.Value,
                    IsHaveValue = true
                });
            }

            foreach (XmlNode childNode in elem.ChildNodes)
            {
                if (childNode is XmlElement childElem)
                {
                    item.Children.Add(CreateElementNodeRecursive(childElem));
                }
            }
            return item;
        }
    }

    [ObservableObject]
    public partial class XmlConfigNode
    {
        [ObservableProperty]
        private string nodeName;

        [ObservableProperty]
        private string nodeValue;

        [ObservableProperty]
        private bool isHaveValue;

        [ObservableProperty]
        private ObservableCollection<XmlConfigNode> children=new ObservableCollection<XmlConfigNode>();
    }

}

 

 

 

 

 

 

 

image

 

image

 

posted @ 2026-07-12 22:01  FredGrit  阅读(6)  评论(0)    收藏  举报