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. xgboost与sklearn的接口

    xgb使用sklearn接口(推荐) XGBClassifier from xgboost.sklearn import XGBClassifier clf = XGBClassifier( sile ...

  2. 2016.6.21——Climbing Stairs

    Climbing Stairs 本题收获: 1.斐波那契函数f(n) = f(n-1) + f(n -2) 题目: You are climbing a stair case. It takes n ...

  3. Dream------Hadoop--Hadoop HA QJM (Quorum Journal Manager)

    In a typical HA cluster, two separate machines are configured as NameNodes. At any point in time, ex ...

  4. bzoj 1014: 洛谷 P4036: [JSOI2008]火星人

    题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...

  5. 新浪的wap网站,发现原来我们的head存在着这样的差异

    前一段时间一直被wap网站的自适应困惑…… 仔细研究了一下新浪的wap网站,发现原来我们的head存在着这样的差异…… <%@page contentType="text/html;c ...

  6. 2018 ICPC 徐州网络赛

    2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...

  7. Github授权新的设备ssh接入

    为Mac生成公钥 步骤: 检查本机是否已有公钥 ls -la ~/.ssh 将原来的公钥删除 rm -rf ~/.ssh 生成新的公钥(填自己的邮箱),然后除了密码,一路默认 ssh-keygen - ...

  8. spring单元测试的基本配置

    @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:trade.ap ...

  9. Python基础:获取平台相关信息

    Windows 10家庭中文版,Python 3.6.4, 本文介绍了使用os.platform.sys三个模块获取Python程序的运行平台相关的信息. os模块:提供 各种各样的操作系统接口 os ...

  10. DOS命令大全(二)

    一般来说dos命令都是在dos程序中进行的,如果电脑中安装有dos程序可以从开机选项中选择进入,在windows 系统中我们还可以从开始运行中输入cmd命令进入操作系统中的dos命令,如下图: 严格的 ...