wpf里面实现层次绑定主要使用HierarchicalDataTemplate,这里主要谈一谈带checkbox的treeview,具体效果见 wpf企业级开发中的几种常见业务场景

  先来看一下我的控件绑定,我这里实现的是模块权限的编辑。具体效果就是选中一个节点,后代节点、祖代节点状态都会发生相应变化,具体变化逻辑大家都懂的,描述起来很罗嗦。

<TreeView Name="TreeView_Right" ItemsSource="{Binding ModuleRight}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type localModel:ModuleRight}" ItemsSource="{Binding ModuleChildren}">
<CheckBox IsThreeState="{Binding IsThreeState}" Content="{Binding MenuName}" IsChecked="{Binding IsChecked}" IsEnabled="{Binding IsEnabled}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem" BasedOn="{StaticResource TreeViewItemStyle}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=OneWay}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>

  下面是对应的绑定类,仅供参考。这里需要说明的就是,IsChecked每次变化时都要递归去修改父节点、子节点的IsChecked属性,其他的跟普通的treeview绑定没什么区别,读者若有不明之处可自行去MSDN上查看treeview的使用。

public class ModuleRight : NotifyModelBase
{
private ModuleRight _parent;
public ModuleRight Parent
{
get
{
return _parent;
}
set
{
_parent = value;
OnPropertyChanged("Parent");
}
} private string _menuName;
public string MenuName
{
get
{
if (AppSetting.GetValue("language") == "en_us")
return MenuName_EN;
return _menuName;
}
set
{
_menuName = value;
}
}
public string MenuName_EN
{
get;
set;
} public string ClassName
{
get;
set;
}
private List<ModuleRight> _moduleChildren;
public List<ModuleRight> ModuleChildren
{
get
{
return _moduleChildren ?? (_moduleChildren = new List<ModuleRight>());
}
set
{
_moduleChildren = value;
}
}
private int _rightValue;
public int RightValue
{
get
{
return _rightValue;
}
set
{
_rightValue = value;
}
} private bool _isThreeState;
public bool IsThreeState
{
get
{
return _isThreeState;
}
set
{
_isThreeState = value;
OnPropertyChanged("IsThreeState");
}
}
private bool _isEnabled = true;
public bool IsEnabled
{
get
{
return _isEnabled;
}
set
{
_isEnabled = value;
OnPropertyChanged("IsEnabled");
}
} private bool? _isChecked = false;
public bool? IsChecked
{
get
{
return _isChecked;
}
set
{
SetIsChecked(value, true, true);
}
} public bool IsExpanded
{
get
{
return _isChecked != false;
}
} public void SetIsChecked(bool? value, bool updateChildren, bool updateParent)
{
_isChecked = value;
if (updateChildren && _isChecked.HasValue)//设置后代节点的选中状态
{
ModuleChildren.ForEach(c => c.SetIsChecked(_isChecked, true, false));
}
if (updateParent && Parent != null && Parent.IsThreeState)//设置祖代节点的选中状态
{
Parent.VerifyCheckState();
}
OnPropertyChanged("IsChecked");
} public void VerifyCheckState()
{
bool? state = true;
for (int i = ; i < ModuleChildren.Count; i++)
{
bool? current = ModuleChildren[i].IsChecked;
if (current == null)
{
state = null;
break;
}
else
{
if (i < ModuleChildren.Count - && ModuleChildren[i].IsChecked != ModuleChildren[i + ].IsChecked)
{
state = null;
break;
}
}
}
if (state != null)
state = ModuleChildren[].IsChecked;
SetIsChecked(state, false, true);
} public ModuleRight()
{
}
public ModuleRight(string menuName, string menuName_en, string className)
{
this.MenuName = menuName;
this.MenuName_EN = menuName_en;
this.ClassName = className;
} }

wpf企业应用之带选项框的TreeView的更多相关文章

  1. iOS webview加载html自定义选项框选词

    项目要求:webview加载html网址,内容为英文文本,需要获取文本上的单词 这个是最终效果图: 思路是先实现自定义的选项框(不带系统选项)再获取到滑选的单词: 实现的步骤: 首先是替换掉系统长按出 ...

  2. 带搜索框的jQuery下拉框插件

    由于下拉框的条数有几十个,于是打算找一个可以搜索查找功能的下拉框,刚开始在网上看了几个,都是有浏览器兼容性问题,后来看到这个“带搜索框的jQuery下拉框美化插件 searchable”,看演示代码简 ...

  3. wpf实现仿qq消息提示框

    原文:wpf实现仿qq消息提示框 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/huangli321456/article/details/5052 ...

  4. [js开源组件开发]模拟下拉选项框select

    模拟下拉选项框select 在css3流行的情况下,下拉框还是无法满足PD的需求,所以有了autosearch,有了模拟下拉框.效果如下图: select DEMO请案例点击这里查看.http://w ...

  5. css2----实现三角形和带角框

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. MIUI选项框开关样式模拟

    有IOS的开关模拟,当然也有MIUI的开关模拟 看到设置选项里面的开关样式,突发奇想地来试试    最终效果如图: 实现过程 1. 选项框checkbox 模拟开关当然需要一个选项框,这里用到了复选框 ...

  7. Android弹出选项框及指示箭头动画选择

     Android弹出选项框及指示箭头动画选择 Android原生的Spinner提供了下拉列表选项框,但在一些流行的APP中,原生的Spinner似乎不太受待见,而通常会有下图所示的下拉列表选项框 ...

  8. C# WPF 解压缩7zip文件 带进度条 sevenzipsharp

      vs2013附件 :http://download.csdn.net/detail/u012663700/7427461 C# WPF 解压缩7zip文件 带进度条 sevenzipsharp W ...

  9. Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]h ...

随机推荐

  1. php中路径斜杠的应用,兼容win与linux

    更多内容推荐微信公众号,欢迎关注: PHP中斜杠的运用 兼容win和linux 使用常量:DIRECTORY_SEPARATOR如:"www".DIRECTORY_SEPARATO ...

  2. Postman和Selenium IDE开局自带红蓝BUFF属性,就问你要还是不要

    话不多说,下面给大家介绍两款工具,selenium IDE和Postman. 为什么说是自带红蓝Buff,因为想做UI自动化和接口自动化的同学,很多时候,都难在了开头. 比如你要学习语言,你要学习框架 ...

  3. D. Sum in the tree(树形+贪心)

    题目链接;http://codeforces.com/contest/1099/problem/D 题目大意:给出一棵树,每个节点到根节点的路径上经过的所有点的权值之和,其深度为偶数的节点的信息全部擦 ...

  4. Halcon编程-基于形状特征的模板匹配

    halcon软件最高效的一个方面在于模板匹配,号称可以快速进行柔性模板匹配,能够非常方便的用于缺陷检测.目标定位.下面以一个简单的例子说明基于形状特征的模板匹配.      为了在右图中,定位图中的三 ...

  5. 怎么样通过编写Python小程序来统计测试脚本的关键字

    怎么样通过编写Python小程序来统计测试脚本的关键字 通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数.业务函数需要修改,那么势必要找出那些引 ...

  6. 全面了解Nginx主要应用场景【转】

    前言 本文只针对 Nginx 在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 ...

  7. 『实践』百度地图给map添加右键菜单(判断是否为marker)

      var map; var s;//经度 var w;//纬度 $(document).ready(function(){ $(".mune").load("jsp/c ...

  8. TF-图像的深度和通道的概念(转)

    图像的深度和通道概念 图像的深度: 图片是由一个个像素点构成的,所有不同颜色的像素点构成了一副完整的图像,计算机存储图片是以二进制来进行的. 1 bit : 用一位来存储,那么这个像素点的取值范围就是 ...

  9. CentOS/Linux 网卡设置 IP地址配置

    CentOS/Linux下设置IP地址 1:临时修改:1.1:修改IP地址# ifconfig eth0 192.168.100.100 1.2:修改网关地址# route add default g ...

  10. Python基础 - Ubuntu+Nginx+uwsgi+supervisor部署Flask应用

    网上找了许多讲关于Flask应用部署的文章几乎都是一个helloworld的Demo,按照helloworld来部署都没问题,但实际项目部署时还是遇到了不少问题.在这里简单写下自己成功部署的过程,防止 ...