WPF中TreeView数据结构解析

XAML.CS代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Windows;
  7 using System.Windows.Controls;
  8 using System.Windows.Data;
  9 using System.Windows.Documents;
 10 using System.Windows.Input;
 11 using System.Windows.Media;
 12 using System.Windows.Media.Imaging;
 13 using System.Windows.Navigation;
 14 using System.Windows.Shapes;
 15
 16 namespace TreeViewBindingDemo
 17 {
 18     /// <summary>
 19     /// MainWindow.xaml 的交互逻辑
 20     /// </summary>
 21     public partial class MainWindow : Window
 22     {
 23         List<NodeEntry> m_NodeEntrys;
 24         List<NodeEntry> m_outputList;
 25         public MainWindow()
 26         {
 27             InitializeComponent();
 28             m_NodeEntrys = new List<NodeEntry>()
 29         {
 30             new NodeEntry { ID = 2, Name = "北京市", ParentID = 1 },
 31             new NodeEntry { ID = 1, Name = "中国" },
 32             new NodeEntry { ID = 3, Name = "吉林省", ParentID = 1 },
 33             new NodeEntry { ID = 4, Name = "上海市", ParentID = 1 },
 34             new NodeEntry { ID = 5, Name = "海淀区", ParentID = 2 },
 35             new NodeEntry { ID = 6, Name = "朝阳区", ParentID = 2 },
 36             new NodeEntry { ID = 7, Name = "大兴区", ParentID = 2 },
 37             new NodeEntry { ID = 8, Name = "白山市", ParentID = 3 },
 38             new NodeEntry { ID = 9, Name = "长春市", ParentID = 3 },
 39             new NodeEntry { ID = 10, Name = "抚松县", ParentID = 8 },
 40             new NodeEntry { ID = 11, Name = "靖宇县", ParentID = 8 },
 41             new NodeEntry { ID = 13, Name = "靖宇县" }
 42         };
 43             m_outputList = Bind(m_NodeEntrys);
 44             this.treeView1.ItemsSource = m_outputList;
 45             this.treeView2.ItemsSource = m_outputList;
 46         }
 47
 48         private List<NodeEntry> Bind(List<NodeEntry> nodes)
 49         {
 50             List<NodeEntry> outputList=new List<NodeEntry>();
 51             for (int i = 0; i < nodes.Count; i++)
 52             {
 53                 nodes[i].IsChecked = false;
 54                 if (nodes[i].ParentID == -1)
 55                 {
 56                     outputList.Add(nodes[i]);
 57                 }
 58                 else
 59                 {
 60                     FindDownward(nodes,nodes[i].ParentID).NodeEntrys.Add(nodes[i]);
 61                 }
 62             }
 63             return outputList;
 64         }
 65
 66         private NodeEntry FindDownward(List<NodeEntry> nodes, int id)
 67         {
 68             if (nodes == null) return null;
 69             for (int i = 0; i < nodes.Count; i++)
 70             {
 71                 if (nodes[i].ID == id)
 72                 {
 73                     return nodes[i];
 74                 }
 75             }
 76             return null;
 77         }
 78
 79         private void btnOK_Click(object sender, RoutedEventArgs e)
 80         {
 81             try
 82             {
 83                 m_NodeEntrys.Add(new NodeEntry { ID = 14, IsChecked = true, Name = "法国" });
 84                 m_outputList.Add(new NodeEntry { ID = 14, IsChecked = true, Name = "法国" });
 85                 //m_outputList = Bind(m_NodeEntrys);
 86                 NodeEntry node = new NodeEntry();
 87                 this.treeView1.ItemsSource = m_outputList;
 88                 this.treeView2.ItemsSource = null;
 89                 this.treeView2.ItemsSource = m_outputList;
 90             }
 91             catch (Exception ex)
 92             {
 93             }
 94         }
 95         private void btnCancel_Click(object sender, RoutedEventArgs e)
 96         {
 97
 98         }
 99
100         //双向绑定改名,选择
101         private void treeView2_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
102         {
103             NodeEntry item = (NodeEntry)this.treeView2.SelectedItem;
104             item.Name = "dido";
105             item.IsChecked = true;
106             MessageBox.Show(item.ID.ToString());
107         }
108
109
110     }
111 }

实体类:

 1 using System.Collections.Generic;
 2 using System.ComponentModel;
 3
 4 namespace TreeViewBindingDemo
 5 {
 6     public class NodeEntry : INotifyPropertyChanged
 7     {
 8         public NodeEntry()
 9         {
10             this.NodeEntrys = new List<NodeEntry>();
11             this.ParentID = -1;
12             this.IsChecked = true;
13         }
14         int id;
15         public int ID
16         {
17             get { return id; }
18             set { id = value; this.OnPropertyChanged("ID"); }
19         }
20         string name;
21         public string Name
22         {
23             get { return name; }
24             set { name = value; this.OnPropertyChanged("Name"); }
25         }
26         public int ParentID { get; set; }
27         bool isChecked;
28         public bool IsChecked
29         {
30             get { return isChecked; }
31             set { isChecked = value; this.OnPropertyChanged("IsChecked"); }
32         }
33         List<NodeEntry> nodeEntrys;
34         public List<NodeEntry> NodeEntrys
35         {
36             get { return nodeEntrys; }
37             set
38             {
39                 nodeEntrys = value;
40                 this.OnPropertyChanged("NodeEntrys");
41             }
42         }
43         public event PropertyChangedEventHandler PropertyChanged;
44         private void OnPropertyChanged(string prop)
45         {
46             if (this.PropertyChanged != null)
47                 this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
48         }
49     }
50
51 }

XAML代码:

 1 <Window x:Class="TreeViewBindingDemo.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:model="clr-namespace:TreeViewBindingDemo"
 5         Title="MainWindow" Height="350" Width="525">
 6     <Grid>
 7         <Grid.Resources>
 8             <HierarchicalDataTemplate DataType="{x:Type model:NodeEntry}" ItemsSource="{Binding NodeEntrys}">
 9                 <StackPanel Orientation="Horizontal" Margin="0,2,0,2">
10                     <CheckBox Focusable="False"
11                               VerticalAlignment="Center" IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
12                     <TextBlock Text="{Binding Name}" ToolTip="{Binding Name}" Tag="{Binding ID}"/>
13                 </StackPanel>
14                 <HierarchicalDataTemplate.ItemContainerStyle>
15                     <Style TargetType="TreeViewItem">
16                         <Setter Property="IsExpanded" Value="True" />
17                     </Style>
18                 </HierarchicalDataTemplate.ItemContainerStyle>
19             </HierarchicalDataTemplate>
20         </Grid.Resources>
21         <Grid.ColumnDefinitions>
22             <ColumnDefinition MinWidth="100" Width="170*"/>
23             <ColumnDefinition Width="1*" />
24             <ColumnDefinition Width="80" />
25             <ColumnDefinition Width="80" />
26         </Grid.ColumnDefinitions>
27         <Grid.RowDefinitions>
28             <RowDefinition Height="40*" />
29             <RowDefinition Height="40" />
30         </Grid.RowDefinitions>
31         <GridSplitter Grid.Column="1" Grid.RowSpan="5" Name="gridSplitter1" HorizontalAlignment="Stretch" />
32         <Button Content="确定" Grid.Column="2" Grid.Row="1" Height="25" HorizontalAlignment="right" Margin="0,10,0,0" Name="btnOK" Click="btnOK_Click" VerticalAlignment="Top" Width="50" IsDefault="True" />
33         <Button Content="取消" Grid.Column="3" Grid.Row="1" Height="25" HorizontalAlignment="right" Margin="0,10,10,0" Name="btnCancel" Click="btnCancel_Click" VerticalAlignment="Top" Width="50" IsCancel="True" />
34         <TreeView Grid.ColumnSpan="2"  Name="treeView1" >
35         </TreeView>
36         <TreeView Grid.Column="2" Grid.ColumnSpan="2"  Name="treeView2" SelectedItemChanged="treeView2_SelectedItemChanged">
37         </TreeView>
38     </Grid>
39
40 </Window>

时间: 2024-10-05 04:55:35

WPF中TreeView数据结构解析的相关文章

WPF中TreeView.BringIntoView方法的替代方案

原文:WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoView()方法并不是那么地好用,不少时候会没有效果,这里有一个替代方案,调用SelectItem()方法可以展开并呈现TreeView上指定的Item: public static class TreeViewHelper { /// <summary> /// Expands all children of a TreeView /// </summary&g

WPF中TreeView的使用

因为项目中需要用到TreeView控件,由于是第一次在WPF中用到,因此事先在网上搜了很多关于数据绑定的方法介绍,个人经过实际应用,觉得WPF中的HierarchicalDataTemplate定义模板确实好用很多,但是今天在自己的WPF+MVVM项目中使用了另一种方式.代码不妥之处,望赐教. 先说数据绑定: 1.前台Xmal代码:(没有使用模板定义) <TreeView Name="treeview"/> /2.在后台的XAML交互逻辑cs代码添加数据上下文并将 tree

WPF中TreeView控件的使用案例

WPF总体来说还是比较方便的,其中变化最大的主要是Listview和Treeview控件,而且TreeView似乎在WPF是一个备受指责的控件,很多人说他不好用.我这个demo主要是在wpf中使用TreeView控件实现图片查看功能,简单的Grid布局.TreeView控件添加图标.TreeView控件的一些事件.显示统计.还有就是读取文件操作. 效果图: 前端主要代码: <Window x:Class="TreeViewDemo.MainWindow" xmlns="

WPF中TreeView控件数据绑定和后台动态添加数据

数据绑定: TreeView数据绑定需要使用层次结构数据模板(HierarchicalDataTemplate)来显示分层数据.XAML代码如下: <TreeView Name="chapterTree" Grid.Column="0"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Path=ChildNodes}"&

iOS中XML、JSON数据结构解析以及第三方类的引用

今天讲到数据结构解析的内容:XML和JSON两种 XML数据结构:是扩展于HTML,主要使用标签对<start></start> 其解析有两种: 1.SAX解析(Simple API for XML).是基于事件驱动的解析方式,逐行解析数据(采用协议回调机制) NSXMLParser是iOS自带的XML解析类.解析过程由NSXMLParserDelegate协议方式回调 解析过程:开始标签-->取值-->结束标签-->取值 使用过程如下: @interface T

MVVM模式解析和在WPF中的实现(三) 命令绑定

MVVM模式解析和在WPF中的实现(三) 命令绑定 0x00 命令绑定要达到的效果 命令绑定要关注的核心就是两个方面的问题,命令能否执行和命令怎么执行.也就是说当View中的一个Button绑定了ViewModel中一个命令后,什么时候这个Button是可用的,按下Button后执行什么操作.解决了这两个问题基本就实现了命令绑定.另外一个问题就是执行过程中需要的数据(参数)要如何传递.本次主要探讨这几个问题. 0x01 命令绑定的实现 自定义一个能够被绑定的命令需要实现ICommand接口.该接

捕捉WPF应用程序中XAML代码解析异常

原文:捕捉WPF应用程序中XAML代码解析异常 由于WPF应用程序中XAML代码在很多时候是运行时加载处理的.比如DynamicResource,但是在编译或者运行的过程中,编写的XAML代码很可能有错误,此时XAML代码解析器通常会抛出称为XamlParseException的异常.但是抛出的XamlParseException异常提供的信息非常简单,或者是很不准确.此时我们关于通过对变通的方法来获取更多的异常信息: 我们知道,WPF应用程序中的XAML代码是在InitializeCompon

MVVM模式解析和在WPF中的实现(一)

MVVM模式简介 MVVM是Model.View.ViewModel的简写,这种模式的引入就是使用ViewModel来降低View和Model的耦合,说是降低View和Model的耦合.也可以说是是降低界面和逻辑的耦合,理想情况下界面和逻辑是完全分离的,单方面更改界面时不需要对逻辑代码改动,同样的逻辑代码更改时也不需要更改界面.同一个ViewModel可以使用完全不用的View进行展示,同一个View也可以使用不同的ViewModel以提供不同的操作. 1.Model Model就是一个clas

WPF中的事件列表 .

以下是WPF中的常见事件汇总表(按字母排序),翻译不见得准确,但希望对你有用. 事件 描述 Annotation.AnchorChanged 新增.移除或修改 Anchor 元素时发生. Annotation.AuthorChanged 新增.移除或修改 Author 元素时发生. Annotation.CargoChanged 新增.移除或修改 Cargo 元素时发生. AnnotationStore.AnchorChanged 存放区中任何注释上的 Anchor 元素变化时发生. Annot