范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

CWPFTreeView用法实例解析

  概述
  TreeView是常用的树状列表,在项目开发中也时常会用到,这节主要讲解treeview在wpf的基本用法!
  结果演示:
  代码讲解
  前台xaml:<UserControl x:Class="Caliburn.Micro.Hello.Views.TreeViewView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  xmlns:local="clr-namespace:Caliburn.Micro.Hello.Views"  xmlns:self="clr-namespace:Caliburn.Micro.Hello.ViewModels"  xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"  xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:cal="http://www.caliburnproject.org"  mc:Ignorable="d"  d:DesignHeight="450" d:DesignWidth="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> Grid.ColumnDefinitions>
   <dxg:TreeListControl  ItemsSource="{Binding EmployeeDepartments}"  SelectedItem="{Binding CurrentSelectedItem}" Grid.Column="0" > <dxg:TreeListControl.View> <dxg:TreeListView AllowColumnFiltering="False" AllowConditionalFormattingMenu="False" AllowFixedColumnMenu="False" AllowRecursiveNodeChecking="True" AutoWidth="True" FetchSublevelChildrenOnExpand="False" IsColumnMenuEnabled="False" IsRowCellMenuEnabled="True" IsTotalSummaryMenuEnabled="False" KeyFieldName="Id" ParentFieldName="ParentId" ShowNodeImages="True" ShowSearchPanelMode="Always"> dxg:TreeListView> dxg:TreeListControl.View> <dxg:TreeListColumn AllowEditing="False" FieldName="Employees.Name" Header="{Binding TreeTitle}" /> dxg:TreeListControl>
   <TreeView Grid.Column="1" Margin="10,15,10,10" ItemsSource="{Binding EmployeeDepartments}"> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}" /> TreeView.ItemContainerStyle> <TreeView.ItemTemplate> <HierarchicalDataTemplate DataType="{x:Type self:EmployeeDepartment}" ItemsSource="{Binding Employees}"> <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal"> <CheckBox IsChecked="True"/> <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding Name}" TextTrimming="CharacterEllipsis" /> StackPanel> HierarchicalDataTemplate> TreeView.ItemTemplate> TreeView>  <TreeView Grid.Column="0" Grid.Row="1" ItemsSource="{Binding EmployeeDepartments}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Employees}"> <StackPanel> <TextBlock Text="{Binding Name}"/> StackPanel> HierarchicalDataTemplate> TreeView.ItemTemplate> TreeView>
   <TreeView Grid.Column="1" Grid.Row="1" ItemsSource="{Binding nodesCollection}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}"> <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">  <CheckBox IsChecked="{Binding IsChecked}"  cal:Message.Attach="[Event Click]=[Action CheckBox_Click($source,$eventArgs)]" /> <TextBlock  VerticalAlignment="Center" FontSize="14" Text="{Binding NodeName}" TextTrimming="CharacterEllipsis" /> StackPanel> HierarchicalDataTemplate> TreeView.ItemTemplate> TreeView> Grid>UserControl>
  后台cs代码:
  using PropertyChanged;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Windows;using System.Windows.Controls;
  namespace Caliburn.Micro.Hello.ViewModels{ public class TreeViewViewModel : Screen, IViewModel { public TreeViewViewModel() { DisplayName = "TreeView"; EmployeeDepartments = Departments.GetDepartments();
   //方法1 //nodes = new List() //{ // new TreeNode(){ ParentID = 0,NodeID = 1,NodeName = "Chapter1"}, // new TreeNode(){ ParentID = 0,NodeID = 2,NodeName = "Chapter2"}, // new TreeNode(){ ParentID = 0,NodeID = 3,NodeName = "Chapter3"}, // new TreeNode(){ ParentID = 1,NodeID = 4,NodeName = "Section1.1"}, // new TreeNode(){ ParentID = 1,NodeID = 5,NodeName = "Section1.2"}, // new TreeNode(){ ParentID = 2,NodeID = 6,NodeName = "Section2.1"}, // new TreeNode(){ ParentID = 3,NodeID = 7,NodeName = "Section3.1"}, // new TreeNode(){ ParentID = 6,NodeID = 8,NodeName = "SubSection2.1.1"}, // new TreeNode(){ ParentID = 6,NodeID = 9,NodeName = "SubSection2.1.2"}, // new TreeNode(){ ParentID = 2,NodeID = 10,NodeName = "Section2.2"}, // new TreeNode(){ ParentID = 3,NodeID = 11,NodeName = "Section3.2"}, //}; //nodes = getNodes(0,nodes);
   //方法2  nodesCollection = new ObservableCollection() { new TreeNode() { NodeName = "中国人", ChildNodes = new ObservableCollection() { new TreeNode(){ NodeName = "李嘉诚"}, new TreeNode() { NodeName = "王健林", ChildNodes = new ObservableCollection() { new TreeNode(){ NodeName = "68岁"}, new TreeNode(){ NodeName = "一个儿子"}, } }, } }, new TreeNode() { NodeName = "外国人", ChildNodes = new ObservableCollection() { new TreeNode() { NodeName = "马斯克", ChildNodes = new ObservableCollection() { new TreeNode(){ NodeName = "51岁"}, new TreeNode(){ NodeName = "10个老婆"}, } }, } } }; } public List EmployeeDepartments { get; set; }
   public List nodes { get; set; } public ObservableCollection nodesCollection { get; set; } //private List getNodes(int parentID, List nodes) //{ // List mainNodes = nodes.Where(x => x.ParentID == parentID).ToList(); // List otherNodes = nodes.Where(x => x.ParentID != parentID).ToList(); // foreach (TreeNode node in mainNodes) // node.ChildNodes = getNodes(node.NodeID, otherNodes); // return mainNodes; //} public void CheckBox_Click(object sender, RoutedEventArgs e) { CheckBox checkBox; if (sender is CheckBox) { checkBox = sender as CheckBox; } else { return; }
   //SetIsChecked(nodesCollection); foreach (var childNode in nodesCollection) { //SetIsChecked(childNode, checkBox.IsChecked); SetIsChecked(childNode); } }
   //public void SetIsChecked(ObservableCollection childNodes) //{ // foreach (var childNode in childNodes) // { // if(!childNode.IsChecked) // { // foreach (var child in childNode.ChildNodes) // { // child.IsChecked = false; // SetIsChecked(child.ChildNodes); // } // } // else // { // SetIsChecked(childNode.ChildNodes); // } // } //}
   public void SetIsChecked(TreeNode treeNode) { foreach (var child in treeNode.ChildNodes) { if (!treeNode.IsChecked) { child.IsChecked = false; } SetIsChecked(child); } }
   }
   public static class Departments { public static List GetDepartments() { List departments = new List(); departments.Add(new EmployeeDepartment("Management", new Employee[] { new Employee(0, "Gregory S. Price") })); departments.Add(new EmployeeDepartment("Marketing", new Employee[] { new Employee(1, "Irma R. Marshall"), new Employee(2, "Brian C. Cowling"), new Employee(3, "Thomas C. Dawson"), new Employee(4, "Bryan R. Henderson"), })); departments.Add(new EmployeeDepartment("Operations", new Employee[] { new Employee(5, "John C. Powell"), new Employee(6, "Harold S. Brandes"), new Employee(7, "Jan K. Sisk"), new Employee(8, "Sidney L. Holder"), })); departments.Add(new EmployeeDepartment("Production", new Employee[] { new Employee(9, "Christian P. Laclair"), new Employee(10, "James L. Kelsey"), new Employee(11, "Howard M. Carpenter"), new Employee(12, "Jennifer T. Tapia"), })); departments.Add(new EmployeeDepartment("Finance", new Employee[] { new Employee(13, "Karen J. Kelly"), new Employee(14, "Judith P. Underhill"), new Employee(15, "Russell E. Belton"), })); return departments; } }
   public class Employee { public Employee(int id, string name) { ID = id; Name = name; } public int ID { get; set; } public string Name { get; set; } } public class EmployeeDepartment { public string Name { get; set; } public ObservableCollection Employees { get; }
   public EmployeeDepartment(string name, IEnumerable employees) { Name = name; Employees = new ObservableCollection(employees); } }
   [AddINotifyPropertyChangedInterface] public class TreeNode { //public int NodeID { get; set; } //public int ParentID { get; set; } public string NodeName { get; set; } public bool IsChecked { get; set; } public ObservableCollection ChildNodes { get; set; } public TreeNode() { IsChecked = true; ChildNodes = new ObservableCollection(); } }}
  通过SetIsChecked方法实现了主节点取消勾选后,子节点也跟着去勾选,要勾选子节点,也先得选中主节点.源码下载
  链接:https://pan.baidu.com/s/1ty500tUFPNGtfnJorqaZ7A
  提取码:6666

中国气象局召开专题会议研究部署西南地区业务能力提升工作5月31日,中国气象局召开专题会议,交流西南地区业务能力提升工作进展,研究梳理存在问题,部署下一步工作。中国气象局党组书记局长庄国泰强调,要深入贯彻落实习近平总书记关于气象工作重要2010年辽宁农妇收留黑熊弃婴,当成孙子养,驯养得温顺可爱熊,是一种外表十分可爱的动物,但是,在它们呆萌的外表之下,却隐藏着嗜血的本性。恶熊伤人吃人的新闻经常见诸报端。可是,在辽宁丹东附近的一个村庄,却有一位农妇,将一头被遗弃的小熊当成孙问法热线朋友欠10万元钱不还,借款人找上担保人要账半岛问法热线聚焦借贷纠纷,电话不断两位律师在线解答半岛全媒体记者尹彦鑫蒋凯实习生彭天琪购房时房屋有第三方借款抵押该怎么办?担保人的一般保证责任和连带保证责任有什么区别?5月31日,半岛问法热线聚焦借贷纠纷,山东华赛律师事务所周静怡佩里西奇以队歌告别自豪为国米效力这是段持续一生的无限快乐直播吧5月31日讯佩里西奇更新社媒,发文告别国际米兰,他以国米队歌作为结尾。佩里西奇写道我身穿代表着荣耀的国米球衣,进行了254场比赛,18934分钟的出场时间,贡献了55个进球,网红知名探花小宝落网记,当红时一晚赚十万,最后锒铛入狱了导读网红探花小宝落网记,当红时一晚赚十万,最后锒铛入狱了。探花到底是什么意思?有点像古代寻花问柳的意思探花是一种违法犯罪行为在网络直播中,探花的任务就是约一些漂亮的美女一起打扑克,卡根的预言弗雷德里克。卡根(FrederickW。Kagan),美国企业研究所常驻学者,西点军校军史教授,6月7日在ISW发文说北顿涅茨克战役是俄罗斯以战斗形式进行的情报行动,莫斯科的主要目你经历过绝望吗?看看这些人的经历话说,人生在世,难免会遇到各种倒霉的事,或者犯各种错误,俗话说知错能改,善莫大焉,然而,有些错误的代价却有点高在reddit上,有一个叫ThatLookedExpensive(那看邀罗智强当空战指挥官?张善政最新回应张善政(中)。(图片来源台湾中时新闻网)中国台湾网6月8日讯据台湾中时新闻网报道,中国国民党主席朱立伦征召台行政机构前负责人张善政参选桃园市长,引发蓝营一场内部风暴,最后是中国国民汉成帝一个荒谬绝伦的败家子滚滚长江东逝水,浪花淘尽英雄,是非成败转头空,青山依旧在,几度夕阳红。纵观中国历史,犹如一本百科全书,形形色色的人物,你方唱罢我登场。有的人留名青史,有的人背负骂名。有的人荒谬绝伦妹子,你这样补车胎,创口贴有点小吧妹子,赶紧下去吧!旁边的大哥笑了一下兄弟,你的手还能钓鱼五菱不愧是大哥,天塌下来大哥顶着!妹子,你这样补车胎,创口贴有点小吧兄弟,你估计快失去这个儿媳妇了兄弟,你这一下摔得挺惨的走600多吨的安俄罗斯和乌克兰的战争愈演愈烈,在这样的情形之下,大家都会有更多的担心,在武器发展以及众多方面大家都觉得乌克兰其实是不如俄罗斯。俄罗斯近几年来的发展非常的有优势,不论是在经济还是武器
抖音打击同质化不良信息公告(第十四期)抖音倡导用户分享真实文明健康的内容,共建风清气正的社区氛围,对同质化不良信息进行持续打击。近日,平台在日常巡查中发现,有极个别用户发布医疗相关同质化内容,并博取流量,平台对其进行了胡润百富榜成黑名单?从许家印到马云,为何企业家会不断跌落神坛持久,是一个男人的问题,也是一个社会的问题,中国外国概莫能外,国内有亚洲之光君悦时刻,国外有蓝色小药丸风靡欧美,名门火衰就补肾壮羊,肝气郁结就疏肝解郁,年老体衰就调节五脏,总归是方土耳其总计8500多万人,普通人一月工资,到底有多少钱?在之前的文章中,作者和大家聊了一系列关于各国工资水平和经济发展的故事,例如俄罗斯日本等等。今天,我们聊聊土耳其,最近几天,土耳其的地震引起了大家的关注。不得不说,地震之后的凄惨情况提前还房贷资金有啥好去处?不妨考虑下这个春节前后,提前还房贷难排队还房贷抢还贷额度等话题引发热议,提前还贷比借钱还难,有提前还贷申请人在网络上如此感叹。据媒体采访报道,很多人觉得房贷利率超过理财利率,理财产品收益不高股市快递见证消费信心加速恢复(经济聚焦)原标题2月份以来,全国日均业务量超3。3亿件快递见证消费信心加速恢复(经济聚焦)申通快递上海智慧物流园,分拣员正在分拣线上作业。刘启昶摄(人民视觉)陕西西安,京东快递员夜间冒雨送货平顶山市首航食品项目入驻舞钢经开区签约仪式举行2月9日上午,平顶山市首航食品项目入驻舞钢经开区签约仪式在市经开区管委会会议室举行,市委常委统战部部长杨书山,市政府党组成员市经开区管委会主任刘洪涛出席仪式。据了解,平顶山市首航食补贴退出,新能源车销量开始下滑出品首席财经观察作者周松涛新能源车是黄金赛道,现在是,未来也是。但这只是相对于整个行业,并不代表所有的企业都是如此。新能源汽车国家购置补贴政策从2010年开始,到2023年1月1日最新!安徽省退休人员医保新政出台,医保账户金额多了还是少了?自2022年各地区陆续的下发了关于退休人员医保个人进账比例调整的通知后,很多朋友可能会发现自己每月医保账户进账的金额或多或少会发生了一些变化。而2023年又是很多地区开始实施新的医苹果中国官网有望在近期上架官翻iPadmini6和M1iPadPro机型IT之家2月10日消息,苹果美国官网今天开始销售官方翻新的iPadmini6和2021年款iPadPro机型。IT之家查询苹果中国官网,上述两款机型暂未上架,但应该会在近期跟进。根三星中端机型A54曝光更多内容,将搭载自主研发的猎户座芯片三星预计将在2月或3月推出2023年新款GalaxyA系列手机,还未推出GalaxyA345G和GalaxyA545G,这将是三星今年中端手机的代表作。现在,三星GalaxyA54电视盒子哪个最好用?2023性能最好的电视盒子,让电视好用到飞起据相关数据显示,去年电视价格持续走低,70吋的电视价格低至2199元,75吋2699元,85吋的价格也不超过5000元,可以说是卖出了白菜价。于是,2023年很多人打算家电换新,购