using System.Windows.Forms;
using System.Xml;
public void BindXmlToTreeView(string xmlPath, TreeView treeView)
{
var doc = new XmlDocument();
doc.Load(xmlPath);
treeView.Nodes.Clear();
BindNode(doc.DocumentElement, treeView.Nodes);
}
private void BindNode(XmlNode xmlNode, TreeNodeCollection parentNodes)
{
foreach (XmlNode node in xmlNode.ChildNodes)
{
if (node.NodeType != XmlNodeType.Element) continue;
var tn = new TreeNode(node.Attributes["Text"]?.Value ?? node.Name);
tn.Tag = node.Attributes["Url"]?.Value; // 儲存導航資訊
if (node.HasChildNodes)
BindNode(node, tn.Nodes);
parentNodes.Add(tn);
}
}
// 節點點擊導航
private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node.Tag is string url && !string.IsNullOrEmpty(url))
NavigateTo(url); // 實作頁面跳轉
}
public class MenuItemVm
{
public string Text { get; set; }
public string Url { get; set; }
public ObservableCollection Children { get; } = new();
}
// 遞歸建立 ViewModel
public MenuItemVm BuildMenu(XmlNode node)
{
var vm = new MenuItemVm { Text = node.Attributes["Text"]?.Value, Url = node.Attributes["Url"]?.Value };
foreach (XmlNode child in node.ChildNodes)
if (child.NodeType == XmlNodeType.Element)
vm.Children.Add(BuildMenu(child));
return vm;
}
XML → TreeView 核心在於 **遞歸遍歷 `XmlNode`** 對應 **遞歸建立 `TreeNode`/`MenuItemVm`**。WinForms 用 `XmlDocument` + 手動遞歸;WPF 採用 `HierarchicalDataTemplate` + ViewModel 分離關注點;WebForms 直接 `XmlDataSource` + `TreeNodeBinding` 零程式碼。大量資料請啟用虛擬化與延遲載入。