摘要:采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树,

支持勾选。勾选父节点,子节点回全部自动勾选;子节点部分勾选时,父节点半勾选;子节点全部勾选时,父节点勾选。反之亦然。

HierarchicalDataTemplate是分层数据模板,通常用于tree,menu等层级控件。

HierarchicalDataTemplate的ItemsSource属性绑定下一级数据源。
Model为行政区数据实体类,通常访问数据库获取数据并构建对象。
ViewModel为界面的抽象模型,表示界面的数据和行为,是Model和View的桥梁。

view就是界面。

一、代码

1、Model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WpfHierarchicalTemplate
{
public class District
{
public int ID { get; set; }
public string Xzqhdm { get; set; }//行政区划代码
public string Xzqhmc { get; set; }//行政区划名称
public int Level { get; set; }//级别,0全国,1省,2地市,3县,4,乡镇,5,村
public IList<District> Children { get; set; }
public District Parent { get; set; }
}
}

  2、ViewModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace WpfHierarchicalTemplate
{
public class DistrictNodeViewModel : ModelCommon.NotifyObject
{
private bool? isSelected = false; public bool? IsSelected
{
get { return isSelected; }
set
{
isSelected = value;
RaisePropertyChanged("IsSelected");
}
} private bool? isChecked = false; public bool? IsChecked
{
get { return isChecked; }
set
{
SetIsChecked(value);
}
} private void SetIsChecked(bool? value)
{
if (value != isChecked)
{
isChecked = value;
RaisePropertyChanged("IsChecked");
}
if (this.Children.Count > && this.Children[].isChecked != value)
{
//设置子节点勾选状态
foreach (var item in this.Children)
{
if (value!=null)
{
item.IsChecked = value;
}
}
}
if (this.parent != null)
{
if (this.Parent.Children.Count == this.Parent.Children.Count(item => item.isChecked == value))
{
//同一级节点全部选中,则父节点选中。反之亦然。
this.Parent.IsChecked = value;
}
else if (this.Parent.Children.Count > this.Parent.Children.Count(item => item.isChecked == value))
{
if (this.Parent.IsChecked!=null)
{
this.Parent.IsChecked = null;
}
}
} } private bool? isExpand = false; public bool? IsExpand
{
get { return isExpand; }
set
{
isExpand = value;
RaisePropertyChanged("IsExpand");
}
} private BitmapImage img; public BitmapImage Img
{
get { return img; }
set
{
img = value;
RaisePropertyChanged("Img");
}
} private ObservableCollection<DistrictNodeViewModel> children = new ObservableCollection<DistrictNodeViewModel>(); public ObservableCollection<DistrictNodeViewModel> Children
{
get { return children; }
set
{
children = value;
RaisePropertyChanged("Children");
}
} private DistrictNodeViewModel parent; public DistrictNodeViewModel Parent
{
get { return parent; }
set
{
parent = value;
RaisePropertyChanged("Parent");
}
} private District district; public District District
{
get { return district; }
set
{
district = value;
RaisePropertyChanged("District");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
namespace WpfHierarchicalTemplate
{
public class DistrictMainViewModel : ModelCommon.NotifyObject
{
private ObservableCollection<DistrictNodeViewModel> vmNodes; public ObservableCollection<DistrictNodeViewModel> VmNodes
{
get { return vmNodes; }
set
{
vmNodes = value;
RaisePropertyChanged("VmNodes");
}
} public DistrictMainViewModel()
{
this.VmNodes = new ObservableCollection<DistrictNodeViewModel>
{
LoadData()
};
}
public DistrictNodeViewModel LoadData()
{
ObservableCollection<District> rootNodes =new ObservableCollection<District>();
District d00 = new District()
{
Xzqhmc = "全国",
Parent = null
};
District d0 = new District()
{
Xzqhmc="河南",
Parent=d00
}; District d1 = new District()
{
Xzqhmc = "北京",
Parent = d00
}; District d2 = new District()
{
Xzqhmc = "山东",
Parent = d00
};
District d11 = new District()
{
Xzqhmc = "海淀区",
Parent = d1
};
District d12 = new District()
{
Xzqhmc = "石景山区",
Parent = d1
};
District d13 = new District()
{
Xzqhmc = "朝阳区",
Parent = d1
}; District d01 = new District()
{
Xzqhmc = "商丘",
Parent = d0
};
District d02 = new District()
{
Xzqhmc = "郑州",
Parent = d0
};
District d03 = new District()
{
Xzqhmc = "周口",
Parent = d0
};
d1.Children = new List<District> { d11, d12, d13 };
d0.Children = new List<District> { d01, d02, d03 };
d00.Children = new List<District>{d1,d2,d0};
rootNodes.Add(d00);
DistrictNodeViewModel dnv = new DistrictNodeViewModel();
dnv.District = rootNodes[];
SetDNV(dnv, rootNodes[]);
return dnv;
} private void SetDNV(DistrictNodeViewModel vm,District root)
{
if (root==null||root.Children==null||root.Children.Count==)
{
return;
}
foreach (var item in root.Children)
{
DistrictNodeViewModel vmNew = new DistrictNodeViewModel();
vmNew.District = item;
vmNew.Parent = vm;
vmNew.Img = new System.Windows.Media.Imaging.BitmapImage(new Uri("/dog.jpg", UriKind.Relative));
vm.Children.Add(vmNew);
SetDNV(vmNew, item);
}
} }
}

  3、主窗口

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 WpfHierarchicalTemplate
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new DistrictMainViewModel();
}
}
}

  

4、前台xaml

<Window x:Class="WpfHierarchicalTemplate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="" Width="">
<Window.Resources>
<HierarchicalDataTemplate x:Key="treeTemplate" ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"></CheckBox>
<Image Source="{Binding Img}" Height="" Width=""></Image>
<TextBlock Text="{Binding District.Xzqhmc}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView ItemTemplate="{StaticResource treeTemplate}" ItemsSource="{Binding VmNodes}">
</TreeView>
</Grid>
</Window>

  二、效果

TreeView —WPF—MVVM—HierarchicalDataTemplate的更多相关文章

  1. WPF MVVM实现TreeView

    今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1   图2     模版加上了一个checkbox,选中父类的checkb ...

  2. [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?

    [译]聊聊C#中的泛型的使用(新手勿入)   写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...

  3. WPF MVVM 验证

    WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...

  4. WPF MVVM初体验

    首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑 ...

  5. WPF/MVVM 快速开始指南(译)(转)

    WPF/MVVM 快速开始指南(译) 本篇文章是Barry Lapthorn创作的,感觉写得很好,翻译一下,做个纪念.由于英文水平实在太烂,所以翻译有错或者译得不好的地方请多指正.另外由于原文是针对W ...

  6. A WPF/MVVM Countdown Timer

    Introduction This article describes the construction of a countdown timer application written in C# ...

  7. 使用Prism提供的类实现WPF MVVM点餐Demo

    使用Prism提供的类实现WPF MVVM点餐Demo 由于公司开发的技术需求,近期在学习MVVM模式开发WPF应用程序.进过一段时间的学习,感受到:学习MVVM模式,最好的方法就是用MVVM做几个D ...

  8. WPF MVVM使用prism4.1搭建

    WPF MVVM使用prism4.1搭建 MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和 ...

  9. ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet

    Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...

随机推荐

  1. 由于簇计数比预计的高,格式化操作无法完成——Allocation Unit Size Adjustments for Larger NTFS Volumes.

    Allocation Unit Size Adjustments for Larger NTFS Volumes.   Problem: When trying to format a new vol ...

  2. Day2-Python基础2---列表、元组操作

    一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ["maqing"," peilin" ...

  3. 机器学习:数据归一化(Scaler)

    数据归一化(Feature Scaling) 一.为什么要进行数据归一化 原则:样本的所有特征,在特征空间中,对样本的距离产生的影响是同级的: 问题:特征数字化后,由于取值大小不同,造成特征空间中样本 ...

  4. Oracle 下ASM磁盘总结

    Oracle 下ASM磁盘总结 文章转载: Oracle下创建ASM磁盘总结https://blog.csdn.net/okhymok/article/details/78791841?utm_sou ...

  5. 远程摄像头软件mjpg-streamer使用指南

    转 自:http://bbs.hdchina.org/viewthread.php?tid=94749 mjpg-streamer 可以通过文件或者是HTTP方式访问linux UVC兼容摄像头.可以 ...

  6. C# DataTable的常用用法讲解

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...

  7. nginx isis

    Nginx+IIS简单的部署   随着互联网项目用户访问量不断上升,单点web服务器是无法满足大型高并发高负载的业务处理的,为了给web服务器做负载均衡方案,打算采用Nginx搭建负载均衡服务器,把用 ...

  8. Oracle 10g RAC全库flashback

    因业务原因,今天需要做一次全库flashback.以下是操作全过程: 1.确认主库是否能flashback到需要的时间点 在节点1上执行: SQL> alter session set nls_ ...

  9. apache + tomcat 负载均衡分布式集群配置

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  10. leetcode643

    double findMaxAverage(vector<int>& nums, int k) { double max = INT_MIN; int len = nums.siz ...