wpf企业应用之带选项框的TreeView

  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 = 0; i < ModuleChildren.Count; i++)
         {
            bool? current = ModuleChildren[i].IsChecked;
            if (current == null)
            {
               state = null;
               break;
            }
            else
            {
               if (i < ModuleChildren.Count - 1 && ModuleChildren[i].IsChecked != ModuleChildren[i + 1].IsChecked)
               {
                  state = null;
                  break;
               }
            }
         }
         if (state != null)
            state = ModuleChildren[0].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;
      }

 }
时间: 2024-10-14 10:32:19

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

WPF 重写微调自带的样式,ListView、DataGrid、TreeView等所有控件的默认样式

原文:WPF 重写微调自带的样式,ListView.DataGrid.TreeView等所有控件的默认样式 不知道各位在开发中有没有遇到这样的窘迫,开发一个UI,设计给出的效果图和自带的样式的区别很大,然后有的样式通过属性是修改不了的,比如TreeView的子项TreeViewItem,想完全透明背景色就做不到,只有重写Template,然而重写了模板发现很多默认的功能失效了,等等一些列问题:又比如需要重新DataGrid,的DataGridRowHeader模板,又不知这个模板哪些属性必须要给

Xcode常见的选项框

当拖拽资源进入项目时候 ?会提示的选项框 1.Destination ? ? ? ? Copy iTems if ?needs ?将资源copy进自己项目,不过不勾选的话文件就还是自己的源文件,在项目中的操作直接影响源文件 ? 2.added field ?? ? ?1. Create ?groups ? ? ? ? ? ? ? ? 创建一个分组,不是一个真实文件夹,文件夹颜色为黄色 ? ?2.Create folder references ? 创建一个真实文件夹,将资源放进去,在项目文件中

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

vs2013附件 :http://download.csdn.net/detail/u012663700/7427461 C# WPF 解压缩7zip文件 带进度条 sevenzipsharp WPF PNG实现的图形进度条 .NET 3.5 http://sevenzipsharp.codeplex.com/ MainWindow.xaml <Window x:Class="SevenZipTestWPF.MainWindow" xmlns="http://schem

case做带选项的shell脚本以及结合while做交互选择的shell脚本的最基本写法

1.case做带选项的执行脚本: #!/bin/bash case $1 in x) echo "x is selected" ;; *) echo "please use x" esac 二.case结合while做交互脚本: #!/bin/bash while true do read -p "Enter port of chaoxingdata(d,1): " port case ${port} in d) echo "port=

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

作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]http://jq.qq.com/?_wv=1027&k=XVfBTo 要捐钱的就打支付宝吧:13958686678(泥瓦匠开个玩笑~) 一.前言 继续AndroidUI系列,泥瓦匠又要开始扯淡了.哈哈今天在文章头加了个支付宝账号.我也真逗,至今没收到一笔是写博客的钱.或是分享的.泥瓦匠也就挂着逗逗乐

angularJS 可编辑下拉选项框

功能介绍: 该组件将文本框和下拉框的组合,当你点击最右边的下拉按钮,实现下拉框选择的功能:当你选中文本框,实现文本框输入的功能.将文本框和下拉框设置name属性一样他自动会把对应下拉框的值传入后台,而文本框的值不传,当你做文本框使用,它会把文本框的值传入后台而下拉框的值不传. 可编辑下拉选项框 ANY 1 1.html代码 1 <!DOCTYPE html> 2 <html ng-app="myapp"> 3 <head> 4 <meta ch

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

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> /*三角形*/ /* div{width:0;height:0;border-top:10px solid transparent;border-bottom:10px solid transparent;bor

MIUI选项框开关样式模拟

有IOS的开关模拟,当然也有MIUI的开关模拟 看到设置选项里面的开关样式,突发奇想地来试试    最终效果如图: 实现过程 1. 选项框checkbox 模拟开关当然需要一个选项框,这里用到了复选框checkbox 2. 理解开关的过程 点击开关按钮,则开启或关闭.原生的checkbox无法做到图示的效果,所以就需要额外的元素来表示图中的开关 而我们又要使用到checkbox的点击效果以及点击后是否选中(checked)的效果,所以checkbox不能隐藏,但可以用覆盖的方式 为了减少多余标签

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

模拟下拉选项框select 在css3流行的情况下,下拉框还是无法满足PD的需求,所以有了autosearch,有了模拟下拉框.效果如下图: select DEMO请案例点击这里查看.http://www.lovewebgames.com/jsmodule/select.html 源码查看下载请点击这里https://github.com/tianxiangbing/select 调用示例 <select name="select" id="select"&g