Silverlight TreeView 动态绑定Xml 文件

 

随着应用程序的不断升级,客户的需求不断增多,程序员不得不对自己的应用程序做出相应的修改,如果修改的内容较多,那么就必须找出一种简便方法,下面就为大家介绍一下在SilverLight 中左边导航栏TreeView 如何动态绑定 Xml 文件中的数据

1、准备工作,首先建立一个TreeViewData.xml文件,代码如下:

 

复制代码
<?xml version="1.0" encoding="utf-8" ?> 
<root> 
  <node name="系统管理"> 
    <node name="添加用户"/> 
    <node name="用户管理"/> 
    <node name="修改密码"/> 
    <node name="系统参数"/> 
  </node> 
  <node name="操作管理"> 
    <node name="违法数据录入"/> 
    <node name="违法信息套打" /> 
    <node name="业务办理" /> 
  </node> 
</root> 
View Code
复制代码

 

2、建立一个TreeViewLoadXmlTest.xaml文件并在其中添加如下代码:

复制代码
<navigation:Page x:Class="MySilverLight.TreeViewLoadXmlTest"   
           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:common="clr-namespace:System.Windows;assembly=System.Windows.Controls" 
                 xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"    
           mc:Ignorable="d" 
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
           d:DesignWidth="640" d:DesignHeight="480" 
           Title="TreeViewLoadXmlTest Page"> 
    <Grid x:Name="LayoutRoot"> 
        <StackPanel Background="#ffc"> 
            <StackPanel.Resources> 
                <common:HierarchicalDataTemplate 
                    x:Key="childTemplate" 
                    ItemsSource="{Binding Path=Children}"> 
                    <StackPanel> 
                        <TextBlock Text="{Binding Path=Title}" 
                                 FontStyle="Italic"/> 
                    </StackPanel> 
                </common:HierarchicalDataTemplate> 
                <common:HierarchicalDataTemplate 
                    x:Key="treeTemplate" 
                    ItemsSource="{Binding Path=Children}" 
                    ItemTemplate="{StaticResource childTemplate}"> 
                    <TextBlock Text="{Binding Path=Title}" 
                               FontWeight="Bold"/> 
                </common:HierarchicalDataTemplate> 
            </StackPanel.Resources> 
            <!--  
                ItemsSource - 数据源  
                ItemTemplate - 指定层级显示数据的模板  
            --> 
            <controls:TreeView x:Name="treeView" Margin="5" 
                ItemsSource="{Binding}"   
                ItemTemplate="{StaticResource treeTemplate}" 
                SelectedItemChanged="treeView_SelectedItemChanged"> 
            </controls:TreeView> 
        </StackPanel> 
    </Grid> 
</navigation:Page> 
View Code
复制代码

 

值得注意的是,在写代码之前,需要在头部加上这样两句话:

xmlns:common="clr-namespace:System.Windows;assembly=System.Windows.Controls"
                 xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
View Code

 

否则,在后面会提示common 和controls出错

 

3、接下来需要准备一个TreeViewModel.cs类,代码如下:

 

复制代码
namespace MySilverLight  
{  
    public class TreeViewModel  
    {  
        public string Title { get; set; }  
        public Uri Address { get; set; }  
        public List<TreeViewModel> Children { get; set; }  
    }  
} 
View Code
复制代码

 

在此需要引入using System.Collections.Generic;

 

4、打开后台代码文件TreeViewLoadXmlTest.xaml.cs ,代码如下:

 

复制代码
namespace MySilverLight  
{  
    public partial class TreeViewLoadXmlTest : Page  
    {  
        public TreeViewLoadXmlTest()  
        {  
            InitializeComponent();  
            this.Loaded += new RoutedEventHandler(TreeView_Loaded);  
        }  
 
        // 当用户导航到此页面时执行。  
        protected override void OnNavigatedTo(NavigationEventArgs e)  
        {  
        }  
        void TreeView_Loaded(object sender, RoutedEventArgs e)  
        {  
            XElement root = XElement.Load("TreeViewData.xml");  
 
            // 构造带层级关系的数据源(递归方式)  
            var result = LoadData(root);  
 
            treeView.DataContext = result;  
        }  
        private List<TreeViewModel> LoadData(XElement root)  
        {  
            if (root == null)  
                return null;  
 
            var items = from n in root.Elements("node")  
                        select new TreeViewModel  
                        {  
                            Title = (string)n.Attribute("name"),  
                            Children = LoadData(n)  
                        };  
 
            return items.ToList();  
        }  
        private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)  
        {  
            MessageBox.Show(((TreeViewModel)e.NewValue).Title);  
        }  
    }  
} 
复制代码

 

这里同样值得注意的是,需要引用命名空间,System.Xml.Linq;否则XElement会提示找不到;

直到这里,我们的工作基本上算是完成了,效果如下:

 

 

 

本文出自 “程序人生_意念” 博客,请务必保留此出处http://07180402.blog.51cto.com/3679519/987599

posted @   楠木大叔  阅读(342)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示