WPF TreeView IsExpanded 绑定不上的问题
最近项目上需要通过MVVM来控制TreeView,其中需要需要控制通过搜索来定位某个节点,正常逻辑下,首先通过需要在树上面找到该节点,然后选中该节点,并将该节点的父节点展开,这个时候需要通过MVVM来控制,需要绑定起来,只是一直没有binding上,代码如下:
MVVM示例代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Collections.ObjectModel; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace DragDrop 9 { 10 class DataItem : NotifyPropertyBase, ICloneable 11 { 12 public DataItem(string header, int deepth = 1) 13 { 14 Header = header; 15 Deepth = deepth; 16 } 17 18 public object Clone() 19 { 20 DataItem dataItem = new DataItem(Header, Deepth); 21 dataItem.IsExpanded = IsExpanded; 22 dataItem.IsSelected = IsSelected; 23 dataItem.Deepth = Deepth; 24 foreach (DataItem item in Items) 25 dataItem.Items.Add((DataItem)item.Clone()); 26 return dataItem; 27 } 28 29 private string header; 30 public string Header 31 { 32 get { return header; } 33 set 34 { 35 SetProperty(ref header, value); 36 } 37 } 38 39 private bool isSelected; 40 public bool IsSelected 41 { 42 get { return isSelected; } 43 set { SetProperty(ref isSelected, value); } 44 } 45 46 private bool isExpanded; 47 public bool IsExpanded 48 { 49 get { return isExpanded; } 50 set 51 { 52 SetProperty(ref isExpanded, value); 53 Console.WriteLine("{0}--{1}", Header, IsExpanded); 54 } 55 } 56 57 private int deepth; 58 public int Deepth 59 { 60 get { return deepth; } 61 set 62 { 63 if (deepth != value) 64 { 65 deepth = value; 66 SetProperty(ref deepth, value); 67 } 68 } 69 } 70 71 private ObservableCollection<DataItem> mItems = null; 72 public ObservableCollection<DataItem> Items 73 { 74 get 75 { 76 if (mItems == null) 77 mItems = new ObservableCollection<DataItem>(); 78 return mItems; 79 } 80 } 81 82 } 83 84 class Data 85 { 86 private static Data mInstance = new Data(); 87 88 public static Data Instance 89 { 90 get { return mInstance; } 91 } 92 93 private ObservableCollection<DataItem> GenerateTreeViewItems() 94 { 95 ObservableCollection<DataItem> items = new ObservableCollection<DataItem>(); 96 97 DataItem item1 = new DataItem("TreeViewItem1"); 98 item1.Items.Add(new DataItem("SubItem1", item1.Deepth)); 99 item1.Items.Add(new DataItem("SubItem2", item1.Deepth)); 100 item1.Items.Add(new DataItem("SubItem3", item1.Deepth)); 101 item1.Items.Add(new DataItem("SubItem4", item1.Deepth)); 102 items.Add(item1); 103 104 DataItem item2 = new DataItem("TreeViewItem2"); 105 item2.Items.Add(new DataItem("SubItem1", item2.Deepth)); 106 item2.Items.Add(new DataItem("SubItem2", item2.Deepth)); 107 items.Add(item2); 108 109 DataItem item3 = new DataItem("TreeViewItem3"); 110 item3.Items.Add(new DataItem("SubItem1", item3.Deepth)); 111 item3.Items.Add(new DataItem("SubItem2", item3.Deepth)); 112 item3.Items.Add(new DataItem("SubItem3", item3.Deepth)); 113 item3.Items.Add(new DataItem("SubItem4", item3.Deepth)); 114 item3.Items.Add(new DataItem("SubItem5", item3.Deepth)); 115 item3.Items.Add(new DataItem("SubItem6", item3.Deepth)); 116 item3.Items.Add(new DataItem("SubItem7", item3.Deepth)); 117 item3.Items.Add(new DataItem("SubItem8", item3.Deepth)); 118 items.Add(item3); 119 120 return items; 121 } 122 123 private ObservableCollection<DataItem> GenerateListItems() 124 { 125 ObservableCollection<DataItem> items = new ObservableCollection<DataItem>(); 126 items.Add(new DataItem("ListBoxItem1")); 127 items.Add(new DataItem("ListBoxItem2")); 128 items.Add(new DataItem("ListBoxItem3")); 129 items.Add(new DataItem("ListBoxItem4")); 130 items.Add(new DataItem("ListBoxItem5")); 131 return items; 132 } 133 134 public ObservableCollection<DataItem> TreeViewItems 135 { 136 get 137 { 138 if (mTreeViewItems == null) 139 mTreeViewItems = GenerateTreeViewItems(); 140 return mTreeViewItems; 141 } 142 } 143 144 public ObservableCollection<DataItem> ListBoxItems 145 { 146 get 147 { 148 if (mListBoxItems == null) 149 mListBoxItems = GenerateListItems(); 150 return mListBoxItems; 151 } 152 } 153 154 private ObservableCollection<DataItem> mTreeViewItems = null; 155 private ObservableCollection<DataItem> mListBoxItems = null; 156 } 157 }
界面代码:
1 <Window x:Class="DragDrop.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:DragDrop" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="350" Width="525"> 9 <Window.Resources> 10 <HierarchicalDataTemplate x:Key="treeViewTemplate" DataType="{x:Type local:DataItem}" ItemsSource="{Binding Items}"> 11 <TextBlock Text="{Binding Header}"/> 12 </HierarchicalDataTemplate> 13 14 <Style x:Key="TreeViewStyle" TargetType="{x:Type TreeViewItem}"> 15 <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 16 <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 17 <Style.Triggers> 18 <DataTrigger Binding="{Binding Deepth}" Value="1"> 19 <Setter Property="IsExpanded" Value="True"/> 20 </DataTrigger> 21 </Style.Triggers> 22 </Style> 23 </Window.Resources> 24 <Grid x:Name="mTopLevelGrid"> 25 <TreeView x:Name="mTreeView" Grid.Column="0" 26 ItemsSource="{Binding Source={x:Static local:Data.Instance}, Path=TreeViewItems}" 27 ItemTemplate="{StaticResource treeViewTemplate}" 28 ItemContainerStyle="{StaticResource TreeViewStyle}"/> 29 </Grid> 30 </Window>
数据的绑定没有问题,界面没有问题,奇怪的是IsSelected可以正常绑定,但是IsExpanded就是不行,后来发现这两个属性唯一的区别就是在TreeView的式样中
1 <Style.Triggers> 2 <DataTrigger Binding="{Binding Deepth}" Value="1"> 3 <Setter Property="IsExpanded" Value="True"/> 4 </DataTrigger> 5 </Style.Triggers>
后面把这个DataTrigger这段代码注释掉,编译一下,重新运行,IsExpanded就可以正常绑定。后面自己思考了一下,MVVM模式实现将ViewModel与界面上面的显示绑定起来,实际上也就是使用了观察者模式,而Trigger的原理应该和数据binding是一样的,而且这个Trigger写在后面,可能直接把前面的绑定取代了,但是试了一下,将DataTrigger放到前面,也还是绑定不上,这种可能性排除;个人猜测可能是Trigger的优先级比较高,从而造成IsExpanded一直Binding不上去。
转载于:https://www.cnblogs.com/Johar/p/9886646.html
WPF TreeView IsExpanded 绑定不上的问题相关推荐
- WPF TreeView 绑定(demo 转)
WPF TreeView 绑定 2018年01月23日 13:55:32 余生余我 阅读数:563 前台: <TreeView x:Name="tree" ItemsSour ...
- 在WPF TreeView中使用复选框
目录 介绍 背景 细节决定成败 功能要求 将Smarts放入ViewModel 树视图配置 将TreeViewItem变成ToggleButton Aero主题中的复选框错误 介绍 本文回顾了一个WP ...
- 使用ViewModel模式简化WPF TreeView
目录 介绍 TreeView的背景 ViewModel的背景 究竟是什么让TreeView如此困难? ViewModel来救援 演示解决方案 演示 1 – 带有文本搜索的家谱 PersonViewMo ...
- WPF TreeView HierarchicalDataTemplate
原文 WPF TreeView HierarchicalDataTemplate <StackPanel Margin="0,0,0,0"><StackPan ...
- 《深入浅出WPF》笔记——绑定篇(一)
上一节,有记录写到:在WPF里,数据驱动UI,数据占核心地位,UI次之.怎么恢复数据的核心地位,那就要先了解一下Binding. 一.Binding 基础 1.1WPF中Data Binding的带来 ...
- C# 递归的应用 TreeView递归绑定数据
递归在WinForm中的应用 最近做项目经常用到递归,刚开始很久没用,不太熟悉,现在研究了下,并写下了学习笔记及开发经验总结. 递归热身 一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法 ...
- WPF TreeView ItemContainerStyle和ItemTemplate ViewModel Binding IsSelected
WPF TreeView ItemContainerStyle和ItemTemplate ViewModel Binding IsSelected 记录一下 直接上代码 记录一下 直接上代码 < ...
- C# WCF WinCE 解决方案 错误提示之:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性...
C# WCF WinCE 解决方案 错误提示之:已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性 网上的解决方案 ...
- 【wpf】在win10系统上弹出toast和notification
原文:[wpf]在win10系统上弹出toast和notification 老规矩,先看效果 右下角的notification: 操作中心的notification: 整体效果: 前提条件 1.需要在 ...
最新文章
- 这样你的电脑还不玩完!?
- 简单工厂模式_计算器实现
- linux dns chroot配置文件,linxu chroot DNS 配置
- 【效率】NB,真PDF神处理工具!
- Codeforce 1042 D. Petya and Array(树状数组、前缀和)
- How to Set up SSH Tunneling (Port Forwarding)?
- 基于中文主观性知识库的句子主观性计算项目
- 计算机操作系统》第06章在线测试,《计算机操作系统》第06章在线测试
- 怎么隐藏li标签_抖音账号如何打标签-7天让抖音账号打上标签
- 2月20日 阻尼牛顿法,拟牛顿法(Quasi-Newton Methods)及各种具体实现方法,共轭梯度法(Conjugate Gradient)
- pip 换源为阿里云
- 记录一下postman汉化踩过的坑
- 计算机中word音乐符号在哪里找,word音乐符号怎么打出来|word音乐符号怎么打
- PID调节经验知识梳理
- Python(关于运算符的运用的作业题)
- 2018中文EI收录情况
- Cross_entropy和softmax
- 总结下macbook 安装win10 双系统丢驱动的问题
- 推荐算法工程师学习路线及工作指南
- java 数组与arraylist_java的数组和arraylist
热门文章
- tomcat处理html流程,Tomcat 简单配置使用,基本工作原理(流程图)
- linux c语言变量地址类型,C语言基础知识:访问内存地址的方法
- 处理血压信号_测血压检测健康,8款高品质血压计推荐
- cov(m[, y, rowvar, bias, ddof, fweights, …])
- hive 增加表字段语录_Hive改表结构的两个坑|避坑指南
- php 模板 自定义函数调用,thinkphp模板中使用自定义函数
- vSAN 监测失败并显示错误:“未能生成 HTML 包:Gem::Package::TooLongFileName: (Failed to generate HTML bundle: Gem::Pac
- 负载均衡 > 用户指南 > 健康检查 > 健康检查概述
- 2017年高频率的互联网校园招聘面试题
- MyBatis学习总结(11)——MyBatis动态Sql语句