Summary: Use hierarchicaldatatemplate data template and TreeView to implement the administrative division tree in MVVM mode,
Support Tick.
One, the code
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;} Administrative Division Code Public string XZQHMC {get; set;} Administrative division name Public int level {get; set;} Level, 0 nationwide, 1 provinces, 2 cities, 3 counties, 4, townships, 5, village 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;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 {if (value! = isChecked) {isChecked = value; raisePropertyChanged ("IsChecked"); } if (this. Children.Count > 0&&this. Children[0].ischecked!=value) {foreach (var item in). Children) { Item. IsChecked = value; }} if (This.parent!=null&&this. Parent.children.count==this. Parent.Children.Count (Item=>item.ischecked==value)) {this. parent.ischecked = value; Return }}} private bool? Isexpand = false; public bool? Isexpand {get {return isexpand;} set {Isexpand = value; raisePropertyChanged ("Isexpand"); }} private Observablecollection<districtnodeviewmodel> children = new Observablecollection<distric Tnodeviewmodel> (); 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 =ne W observablecollection<district> (); District d00 = new District () {XZQHMC = "National ", Parent = null}; District D0 = new District () {xzqhmc= "Henan", parent=d00 }; District D1 = new District () {XZQHMC = "Beijing", Parent = d00}; District D2 = new District () {XZQHMC = "Shandong", Parent = d00}; District D11 = new District () {XZQHMC = "Haidian", Parent = D1}; District D12 = new District () {XZQHMC = "Shijingshan", Parent = D1 }; District D13 = new District () {XZQHMC = "Chaoyang", Parent = D1}; District d01 = new District () {XZQHMC = "Shangqiu", Parent = D0 }; District d02 = new District () {XZQHMC = "Zhengzhou", Parent = D0}; District d03 = new District () {XZQHMC = "Zhoukou", 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[0]; SETDNV (DNV, rootnodes[0]); return to DNV; } private void Setdnv (Districtnodeviewmodel vm,district root) {if (root==null| | Root. children==null| | Root. children.count==0) {return; } foreach (var item in root.) Children) {Districtnodeviewmodel vmnew = new Districtnodeviewmodel (); Vmnew.district = Item;vmnew.parent = VM; Vm. Children.add (vmnew); SETDNV (vmnew, item); } } }}
3. main Window
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 Interactive logic/// </summary> public partial class Mainwindow:window { public MainWindow () { InitializeComponent (); This. DataContext = new Districtmainviewmodel ();}} }
4. Foreground 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=" 350 " Width= "525" > <Window.Resources>
Second, the effect
Treeview-wpf-mvvm-hierarchicaldatatemplate