最近项目上需要通过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 绑定不上的问题相关推荐

  1. WPF TreeView 绑定(demo 转)

    WPF TreeView 绑定 2018年01月23日 13:55:32 余生余我 阅读数:563 前台: <TreeView x:Name="tree" ItemsSour ...

  2. 在WPF TreeView中使用复选框

    目录 介绍 背景 细节决定成败 功能要求 将Smarts放入ViewModel 树视图配置 将TreeViewItem变成ToggleButton Aero主题中的复选框错误 介绍 本文回顾了一个WP ...

  3. 使用ViewModel模式简化WPF TreeView

    目录 介绍 TreeView的背景 ViewModel的背景 究竟是什么让TreeView如此困难? ViewModel来救援 演示解决方案 演示 1 – 带有文本搜索的家谱 PersonViewMo ...

  4. WPF TreeView HierarchicalDataTemplate

    原文 WPF TreeView HierarchicalDataTemplate   <StackPanel Margin="0,0,0,0"><StackPan ...

  5. 《深入浅出WPF》笔记——绑定篇(一)

    上一节,有记录写到:在WPF里,数据驱动UI,数据占核心地位,UI次之.怎么恢复数据的核心地位,那就要先了解一下Binding. 一.Binding 基础 1.1WPF中Data Binding的带来 ...

  6. C# 递归的应用 TreeView递归绑定数据

    递归在WinForm中的应用 最近做项目经常用到递归,刚开始很久没用,不太熟悉,现在研究了下,并写下了学习笔记及开发经验总结. 递归热身 一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法 ...

  7. WPF TreeView ItemContainerStyle和ItemTemplate ViewModel Binding IsSelected

    WPF TreeView ItemContainerStyle和ItemTemplate ViewModel Binding IsSelected 记录一下 直接上代码 记录一下 直接上代码 < ...

  8. C# WCF WinCE 解决方案 错误提示之:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性...

    C# WCF WinCE 解决方案 错误提示之:已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性 网上的解决方案 ...

  9. 【wpf】在win10系统上弹出toast和notification

    原文:[wpf]在win10系统上弹出toast和notification 老规矩,先看效果 右下角的notification: 操作中心的notification: 整体效果: 前提条件 1.需要在 ...

最新文章

  1. 这样你的电脑还不玩完!?
  2. 简单工厂模式_计算器实现
  3. linux dns chroot配置文件,linxu chroot DNS 配置
  4. 【效率】NB,真PDF神处理工具!
  5. Codeforce 1042 D. Petya and Array(树状数组、前缀和)
  6. How to Set up SSH Tunneling (Port Forwarding)?
  7. 基于中文主观性知识库的句子主观性计算项目
  8. 计算机操作系统》第06章在线测试,《计算机操作系统》第06章在线测试
  9. 怎么隐藏li标签_抖音账号如何打标签-7天让抖音账号打上标签
  10. 2月20日 阻尼牛顿法,拟牛顿法(Quasi-Newton Methods)及各种具体实现方法,共轭梯度法(Conjugate Gradient)
  11. pip 换源为阿里云
  12. 记录一下postman汉化踩过的坑
  13. 计算机中word音乐符号在哪里找,word音乐符号怎么打出来|word音乐符号怎么打
  14. PID调节经验知识梳理
  15. Python(关于运算符的运用的作业题)
  16. 2018中文EI收录情况
  17. Cross_entropy和softmax
  18. 总结下macbook 安装win10 双系统丢驱动的问题
  19. 推荐算法工程师学习路线及工作指南
  20. java 数组与arraylist_java的数组和arraylist

热门文章

  1. tomcat处理html流程,Tomcat 简单配置使用,基本工作原理(流程图)
  2. linux c语言变量地址类型,C语言基础知识:访问内存地址的方法
  3. 处理血压信号_测血压检测健康,8款高品质血压计推荐
  4. cov(m[, y, rowvar, bias, ddof, fweights, …])
  5. hive 增加表字段语录_Hive改表结构的两个坑|避坑指南
  6. php 模板 自定义函数调用,thinkphp模板中使用自定义函数
  7. vSAN 监测失败并显示错误:“未能生成 HTML 包:Gem::Package::TooLongFileName: (Failed to generate HTML bundle: Gem::Pac
  8. 负载均衡 > 用户指南 > 健康检查 > 健康检查概述
  9. 2017年高频率的互联网校园招聘面试题
  10. MyBatis学习总结(11)——MyBatis动态Sql语句