XAML.CS代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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; namespace TreeViewBindingDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
List<NodeEntry> m_NodeEntrys;
List<NodeEntry> m_outputList;
public MainWindow()
{
InitializeComponent();
m_NodeEntrys = new List<NodeEntry>()
{
new NodeEntry { ID = , Name = "北京市", ParentID = },
new NodeEntry { ID = , Name = "中国" },
new NodeEntry { ID = , Name = "吉林省", ParentID = },
new NodeEntry { ID = , Name = "上海市", ParentID = },
new NodeEntry { ID = , Name = "海淀区", ParentID = },
new NodeEntry { ID = , Name = "朝阳区", ParentID = },
new NodeEntry { ID = , Name = "大兴区", ParentID = },
new NodeEntry { ID = , Name = "白山市", ParentID = },
new NodeEntry { ID = , Name = "长春市", ParentID = },
new NodeEntry { ID = , Name = "抚松县", ParentID = },
new NodeEntry { ID = , Name = "靖宇县", ParentID = },
new NodeEntry { ID = , Name = "靖宇县" }
};
m_outputList = Bind(m_NodeEntrys);
this.treeView1.ItemsSource = m_outputList;
this.treeView2.ItemsSource = m_outputList;
} private List<NodeEntry> Bind(List<NodeEntry> nodes)
{
List<NodeEntry> outputList=new List<NodeEntry>();
for (int i = ; i < nodes.Count; i++)
{
nodes[i].IsChecked = false;
if (nodes[i].ParentID == -)
{
outputList.Add(nodes[i]);
}
else
{
FindDownward(nodes,nodes[i].ParentID).NodeEntrys.Add(nodes[i]);
}
}
return outputList;
} private NodeEntry FindDownward(List<NodeEntry> nodes, int id)
{
if (nodes == null) return null;
for (int i = ; i < nodes.Count; i++)
{
if (nodes[i].ID == id)
{
return nodes[i];
}
}
return null;
} private void btnOK_Click(object sender, RoutedEventArgs e)
{
try
{
m_NodeEntrys.Add(new NodeEntry { ID = , IsChecked = true, Name = "法国" });
m_outputList.Add(new NodeEntry { ID = , IsChecked = true, Name = "法国" });
//m_outputList = Bind(m_NodeEntrys);
NodeEntry node = new NodeEntry();
this.treeView1.ItemsSource = m_outputList;
this.treeView2.ItemsSource = null;
this.treeView2.ItemsSource = m_outputList;
}
catch (Exception ex)
{
}
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{ } //双向绑定改名,选择
private void treeView2_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
NodeEntry item = (NodeEntry)this.treeView2.SelectedItem;
item.Name = "dido";
item.IsChecked = true;
MessageBox.Show(item.ID.ToString());
} }
}

实体类:

 using System.Collections.Generic;
using System.ComponentModel; namespace TreeViewBindingDemo
{
public class NodeEntry : INotifyPropertyChanged
{
public NodeEntry()
{
this.NodeEntrys = new List<NodeEntry>();
this.ParentID = -;
this.IsChecked = true;
}
int id;
public int ID
{
get { return id; }
set { id = value; this.OnPropertyChanged("ID"); }
}
string name;
public string Name
{
get { return name; }
set { name = value; this.OnPropertyChanged("Name"); }
}
public int ParentID { get; set; }
bool isChecked;
public bool IsChecked
{
get { return isChecked; }
set { isChecked = value; this.OnPropertyChanged("IsChecked"); }
}
List<NodeEntry> nodeEntrys;
public List<NodeEntry> NodeEntrys
{
get { return nodeEntrys; }
set
{
nodeEntrys = value;
this.OnPropertyChanged("NodeEntrys");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
} }

XAML代码:

 <Window x:Class="TreeViewBindingDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:model="clr-namespace:TreeViewBindingDemo"
Title="MainWindow" Height="" Width="">
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate DataType="{x:Type model:NodeEntry}" ItemsSource="{Binding NodeEntrys}">
<StackPanel Orientation="Horizontal" Margin="0,2,0,2">
<CheckBox Focusable="False"
VerticalAlignment="Center" IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
<TextBlock Text="{Binding Name}" ToolTip="{Binding Name}" Tag="{Binding ID}"/>
</StackPanel>
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="" Width="170*"/>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="" />
<ColumnDefinition Width="" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40*" />
<RowDefinition Height="" />
</Grid.RowDefinitions>
<GridSplitter Grid.Column="" Grid.RowSpan="" Name="gridSplitter1" HorizontalAlignment="Stretch" />
<Button Content="确定" Grid.Column="" Grid.Row="" Height="" HorizontalAlignment="right" Margin="0,10,0,0" Name="btnOK" Click="btnOK_Click" VerticalAlignment="Top" Width="" IsDefault="True" />
<Button Content="取消" Grid.Column="" Grid.Row="" Height="" HorizontalAlignment="right" Margin="0,10,10,0" Name="btnCancel" Click="btnCancel_Click" VerticalAlignment="Top" Width="" IsCancel="True" />
<TreeView Grid.ColumnSpan="" Name="treeView1" >
</TreeView>
<TreeView Grid.Column="" Grid.ColumnSpan="" Name="treeView2" SelectedItemChanged="treeView2_SelectedItemChanged">
</TreeView>
</Grid> </Window>

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

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

    原文:WPF中TreeView.BringIntoView方法的替代方案 WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoVie ...

  2. WPF中TreeView的使用

    因为项目中需要用到TreeView控件,由于是第一次在WPF中用到,因此事先在网上搜了很多关于数据绑定的方法介绍,个人经过实际应用,觉得WPF中的HierarchicalDataTemplate定义模 ...

  3. WPF中TreeView控件的使用案例

    WPF总体来说还是比较方便的,其中变化最大的主要是Listview和Treeview控件,而且TreeView似乎在WPF是一个备受指责的控件,很多人说他不好用.我这个demo主要是在wpf中使用Tr ...

  4. WPF中TreeView单击展开其子元素以及点击一个元素展开其他元素收起

    TreeView单击展开其子元素: 在WPF的TreeView控件中,要想展开它的子元素,我们必须要鼠标左键点两下或者右键点一下,那么我们怎样实现左键点一下就使它展开呢? Xaml: <Grid ...

  5. WPF中TreeView控件SelectedItemChanged方法的MVVM绑定

    问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...

  6. WPF中TreeView控件数据绑定和后台动态添加数据(二)

    写在前面:在(一)中,介绍了TreeView控件MVVM模式下数据绑定的方法.在这篇文章中,将总结给节点添加事件的方法,这样说有些不对,总之实现的效果就是点击某个节点,将出现对应于该节点的页面或者数据 ...

  7. WPF中TreeView控件数据绑定和后台动态添加数据(一)

    数据绑定: 更新内容:补充在MVVM模式上的TreeView控件数据绑定的代码. xaml代码: <TreeView Name="syntaxTree" ItemsSourc ...

  8. WPF中TreeView的+-号和连线style的一种实现

    最近又开始跟WPF打交道,项目里面用到了TreeView这个控件.然后需要有一个连线的外观就像是这样 二话不说,百度了一下,找到一个实现, 通道. 把代码拷贝到项目里面,跑了一下,看上去还不错.但是这 ...

  9. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

随机推荐

  1. linux 命令拾遗

    man ascii 这个命令会打印出八进制.十六进制和十进制的ASCII码表. xxd xxd可以生成所给与文件的十六进制拷贝,也可以将编辑好的十六进制拷贝还原成二进制格式.它也可以将十六进制拷贝输出 ...

  2. oracle查看表锁及解锁

    --kill session语句 1 alter system kill SESSION '2171,60490'; --以下几个为相关表 1 2 3 4 5 6 7 SELECT * FROM v$ ...

  3. yum puppet

    config.gem: Unpacked gem factory_girl-1.3.3 in vendor/gems has no specification file. Run 'rake gems ...

  4. cdn加速对门户网站产生的影响

    满意的用户体验是门户网站吸引和留住用户的必备条件.据统计,如果等待网页打开的时间超过8秒,将会有超过30%的用户放弃等待,造成严重的用户流失,降低了用户的体验度和忠诚度.门户网站内容涉及面多,涵盖文字 ...

  5. js修改编辑器内容、修改iframe子页内容

    $('#question-stem-uploader').on('click','',function(){ //获取编辑器内容(ke-edit-iframe: 编辑器iframe的classm名称) ...

  6. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

  7. QTableWidget 导出到表格

    跳槽到了新的公司.開始苦逼的出差现场开发.接触到了新的应用.有非常多应用须要将Table导出成表格,能够把table导出成csv格式的文件. 跟大伙分享一下: lass TableToExcle : ...

  8. 【我所认知的BIOS】—&gt; uEFI AHCI Driver(4) — 第一个Protocol真难搞

    [我所认知的BIOS]-> uEFI AHCI Driver(4) - 第一个Protocol真难搞 LightSeed 4/23/2014 文章对EFI_DRIVER_BINDING_PROT ...

  9. [rxjs] Throttled Buffering in RxJS (debounce)

    Capturing every event can get chatty. Batching events with a throttled buffer in RxJS lets you captu ...

  10. android 61 logcat

    package com.itheima.logcat; import android.os.Bundle; import android.app.Activity; import android.ut ...