TreeView —WPF—MVVM—HierarchicalDataTemplate

2023-10-29

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

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

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

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

view就是界面。

一、代码

1、Model

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace WpfHierarchicalTemplate

{

    public class District

    {

        public int ID { getset; }

        public string   Xzqhdm { getset; }//行政区划代码

        public string Xzqhmc { getset; }//行政区划名称

        public int Level { getset; }//级别,0全国,1省,2地市,3县,4,乡镇,5,村

        public IList<District> Children { getset; }

        public District Parent { getset; }

    }

}

  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 > 0 && this.Children[0].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[0];
            SetDNV(dnv, rootNodes[0]);
            return 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;
                vmNew.Img = new System.Windows.Media.Imaging.BitmapImage(new Uri("/dog.jpg", UriKind.Relative));
                vm.Children.Add(vmNew);
                SetDNV(vmNew, item);
            }
        }

    }
}

复制代码

 

  3、主窗口

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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="350" Width="525">
    <Window.Resources>
        <HierarchicalDataTemplate x:Key="treeTemplate" ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsChecked}"></CheckBox>
                <Image Source="{Binding Img}" Height="20" Width="16"></Image>
                <TextBlock Text="{Binding District.Xzqhmc}"></TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>
    </Window.Resources>
    <Grid>
        <TreeView  ItemTemplate="{StaticResource treeTemplate}" ItemsSource="{Binding VmNodes}">
        </TreeView>
    </Grid>
</Window>

复制代码

 

  二、效果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • git上传代码到github

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1219 一 首先在windows上安装msysgit 1 msysgit下载地址如下 链接 https pan baidu com s 1T
  • 小米红米手机刷入Recovery手机教程-TWRP下载-获取root权限-新增小米12/13Pro适配

    刷机注意 本教程为小米全机型 目前已整理机型都可以使用 请确保你的电脑能正确连接你的手机 部分手机需要解锁BL 小米解锁BL教程 http www romleyuan com lec read id 83 更新日志 20230221更新日志
  • 【atoi函数的介绍以及模拟实现】

    目录 前言 一 atoi函数测试 1 要求 2 测试 二 atoi函数模拟实现 三 补充 前言 位置 atoi函数包含在
  • 天地图服务与开发

    天地图服务与开发 天地图在线地图网址 2021年7月2日 国家地理信息公共服务平台天地图2021版正式启用 传统版地址 https map tianditu gov cn 2020 新版地址 https map tianditu gov c
  • ssh telnet linux中显示中文

    vi etc sysconfig i18n 将内容改为 LANG zh CN GB18030 LANGUAGE zh CN GB18030 zh CN GB2312 zh CN SUPPORTED zh CN GB18030 zh CN z
  • office中excel设置下拉框多选

    我参照了这篇文章 https www php cn topic excel 444717 html 这篇文章整体写得不错 但是有些小瑕疵 问题1 在模块1中保存 这里并没有说清楚 具体是 VBA编辑器中 插入 模块 然后复制以下代码 Pub
  • js if else return不管用_前端知识013 学会异步,JS不再烧脑

    01 同步和异步 0101 认识同步异步 0102 前端经常遇到的异步操作 三个经典例子 0103 拿到异步的结果 轮询和回调 0104 回调的几种方式 02 Promise 0201 Promise基本用法 0202 Promise 基本
  • 【打卡-蓝桥杯】Day 7

    题目1 基础练习 芯片测试 解题思路 因为好的芯片多于坏的 所以如果是好芯片 那个被测试为 1 的 总数 gt n 2 代码 n int input arr list map int input split for in range n f
  • python自动化控制设备有限公司_华为 Python网络自动化

    哈喽 大家好 我是艺博东 是一个思科出身 专注于华为的网工 好了 话不多说 我们直接进入正题 光棍二十年 不知道情人节是什么鬼东西 还是好好学技术吧 努力 奋斗吧 为了早日走向人生巅峰 迎娶白富美 拼了 1 安装环境并导入相关模块 首先是安
  • 错误 0xc0202009: 数据流任务 1: SSIS 错误代码 DTS_E_OLEDBERROR。出现 OLE DB 错误。

    原来是一个varchar字段出出现了 和 等特殊字符 这个在insert语句中没有问题 但是使用导入导出会报错 最后要注意的是 导入导出使用的是BulkInsert 方式 每次可能读取一大段 多行记录一起处理 如果这批数据中有错 那么 程序
  • html5注册阿里巴巴作业,面试分享:2018阿里巴巴前端面试总结(题目+答案)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 使用js实现一个持续的动画效果 最开始的思路是用定时器实现 最后没有想的太完整 面试官给出的答案是用 requestAnimationFrame var e document getElemen
  • Java基础(四)——多态、抽象类、接口、内部类

    一 多态 1 多态性是指同一操作作用于某一类对象 可以有不同的解释 产生不同的执行效果 同一事件发生在不同的对象身上 有不同的效果 2 多态存在的三个必要条件 a 需要存在继承和实现关系 b 同样的方法调用而执行不同操作 运行不同代码 重写
  • JS 中把对象按属性名字母顺序进行排序和倒序

    本文同步发布在 JS 中把对象按属性名字母顺序进行排序和倒序 我们在进行前端开发的时候 有时需要对参数进行签名 签名很多第一步是把对象按属性名字母顺序进行排序 那么在 JS 中如何实现呢 实现方式很多 这边介绍一种通过 ES6 的方式来实现
  • Andy‘s First Dictionary C++ STL set应用

    目录 题目描述 思路分析 代码 题目描述 原文 Andy 8 has a dream he wants to produce his very own dictionary This is not an easy task for him
  • vue实现动态锚点

    div class dialog header item item div 需要点击的目标增加click事件 并且把索引传下去 没有索引也没有关系 想传什么传什么 锚点 getActiveClass index let jump docum
  • 「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏

    本文主要介绍如何从最开始的草图 通过确定基本结构 修改元素布局 美化外观来实现一个网站导航栏 从而熟悉网页开发的基本流程 同时 我们会把性能 规范性 可维护性方面的代码优化也考虑其中 文章目录 本系列前文传送门 一 场景说明 设计目标 二
  • 几种常用激活函数的简介

    1 sigmod函数 函数公式和图表如下图 在sigmod函数中我们可以看到 其输出是在 0 1 这个开区间内 这点很有意思 可以联想到概率 但是严格意义上讲 不要当成概率 sigmod函数曾经是比较流行的 它可以想象成一个神经元的放电率
  • Python正则表达式学习(3)——re.compile()

    re compile pattern flags 0 将正则表达式 pattern 编译为正则表达式对象 可用于使用其 match 和search 方法进行匹配 顺序 prog re compile pattern result prog
  • Pinctrl子系统之一了解基础概念

    1 Linux Pinctrl子系统简介 在许多soc内部都包含有pin控制器 通过pin控制器的寄存器 我们可以配置一个或者一组引脚的功能和特性 在软件方面 Linux内核提供了pinctrl子系统 目的是为了统一各soc厂商的pin脚管
  • TreeView —WPF—MVVM—HierarchicalDataTemplate

    摘要 采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树 支持勾选 勾选父节点 子节点回全部自动勾选 子节点部分勾选时 父节点半勾选 子节点全部勾选时 父节点勾选 反之亦然 Hier