最近项目上需要通过MVVM来控制TreeView,其中需要需要控制通过搜索来定位某个节点,正常逻辑下,首先通过需要在树上面找到该节点,然后选中该节点,并将该节点的父节点展开,这个时候需要通过MVVM来控制,需要绑定起来,只是一直没有binding上,代码如下:
MVVM示例代码:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DragDrop
{
class DataItem : NotifyPropertyBase, ICloneable
{
public DataItem(string header, int deepth = )
{
Header = header;
Deepth = deepth;
} public object Clone()
{
DataItem dataItem = new DataItem(Header, Deepth);
dataItem.IsExpanded = IsExpanded;
dataItem.IsSelected = IsSelected;
dataItem.Deepth = Deepth;
foreach (DataItem item in Items)
dataItem.Items.Add((DataItem)item.Clone());
return dataItem;
} private string header;
public string Header
{
get { return header; }
set
{
SetProperty(ref header, value);
}
} private bool isSelected;
public bool IsSelected
{
get { return isSelected; }
set { SetProperty(ref isSelected, value); }
} private bool isExpanded;
public bool IsExpanded
{
get { return isExpanded; }
set
{
SetProperty(ref isExpanded, value);
Console.WriteLine("{0}--{1}", Header, IsExpanded);
}
} private int deepth;
public int Deepth
{
get { return deepth; }
set
{
if (deepth != value)
{
deepth = value;
SetProperty(ref deepth, value);
}
}
} private ObservableCollection<DataItem> mItems = null;
public ObservableCollection<DataItem> Items
{
get
{
if (mItems == null)
mItems = new ObservableCollection<DataItem>();
return mItems;
}
} } class Data
{
private static Data mInstance = new Data(); public static Data Instance
{
get { return mInstance; }
} private ObservableCollection<DataItem> GenerateTreeViewItems()
{
ObservableCollection<DataItem> items = new ObservableCollection<DataItem>(); DataItem item1 = new DataItem("TreeViewItem1");
item1.Items.Add(new DataItem("SubItem1", item1.Deepth));
item1.Items.Add(new DataItem("SubItem2", item1.Deepth));
item1.Items.Add(new DataItem("SubItem3", item1.Deepth));
item1.Items.Add(new DataItem("SubItem4", item1.Deepth));
items.Add(item1); DataItem item2 = new DataItem("TreeViewItem2");
item2.Items.Add(new DataItem("SubItem1", item2.Deepth));
item2.Items.Add(new DataItem("SubItem2", item2.Deepth));
items.Add(item2); DataItem item3 = new DataItem("TreeViewItem3");
item3.Items.Add(new DataItem("SubItem1", item3.Deepth));
item3.Items.Add(new DataItem("SubItem2", item3.Deepth));
item3.Items.Add(new DataItem("SubItem3", item3.Deepth));
item3.Items.Add(new DataItem("SubItem4", item3.Deepth));
item3.Items.Add(new DataItem("SubItem5", item3.Deepth));
item3.Items.Add(new DataItem("SubItem6", item3.Deepth));
item3.Items.Add(new DataItem("SubItem7", item3.Deepth));
item3.Items.Add(new DataItem("SubItem8", item3.Deepth));
items.Add(item3); return items;
} private ObservableCollection<DataItem> GenerateListItems()
{
ObservableCollection<DataItem> items = new ObservableCollection<DataItem>();
items.Add(new DataItem("ListBoxItem1"));
items.Add(new DataItem("ListBoxItem2"));
items.Add(new DataItem("ListBoxItem3"));
items.Add(new DataItem("ListBoxItem4"));
items.Add(new DataItem("ListBoxItem5"));
return items;
} public ObservableCollection<DataItem> TreeViewItems
{
get
{
if (mTreeViewItems == null)
mTreeViewItems = GenerateTreeViewItems();
return mTreeViewItems;
}
} public ObservableCollection<DataItem> ListBoxItems
{
get
{
if (mListBoxItems == null)
mListBoxItems = GenerateListItems();
return mListBoxItems;
}
} private ObservableCollection<DataItem> mTreeViewItems = null;
private ObservableCollection<DataItem> mListBoxItems = null;
}
}
界面代码:
<Window x:Class="DragDrop.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DragDrop"
mc:Ignorable="d"
Title="MainWindow" Height="" Width="">
<Window.Resources>
<HierarchicalDataTemplate x:Key="treeViewTemplate" DataType="{x:Type local:DataItem}" ItemsSource="{Binding Items}">
<TextBlock Text="{Binding Header}"/>
</HierarchicalDataTemplate> <Style x:Key="TreeViewStyle" TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Deepth}" Value="">
<Setter Property="IsExpanded" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid x:Name="mTopLevelGrid">
<TreeView x:Name="mTreeView" Grid.Column=""
ItemsSource="{Binding Source={x:Static local:Data.Instance}, Path=TreeViewItems}"
ItemTemplate="{StaticResource treeViewTemplate}"
ItemContainerStyle="{StaticResource TreeViewStyle}"/>
</Grid>
</Window>
数据的绑定没有问题,界面没有问题,奇怪的是IsSelected可以正常绑定,但是IsExpanded就是不行,后来发现这两个属性唯一的区别就是在TreeView的式样中
<Style.Triggers>
<DataTrigger Binding="{Binding Deepth}" Value="">
<Setter Property="IsExpanded" Value="True"/>
</DataTrigger>
</Style.Triggers>
后面把这个DataTrigger这段代码注释掉,编译一下,重新运行,IsExpanded就可以正常绑定。后面自己思考了一下,MVVM模式实现将ViewModel与界面上面的显示绑定起来,实际上也就是使用了观察者模式,而Trigger的原理应该和数据binding是一样的,而且这个Trigger写在后面,可能直接把前面的绑定取代了,但是试了一下,将DataTrigger放到前面,也还是绑定不上,这种可能性排除;个人猜测可能是Trigger的优先级比较高,从而造成IsExpanded一直Binding不上去。
WPF TreeView IsExpanded 绑定不上的问题的更多相关文章
-
2019-11-29-WPF-笔刷绑定不上可能的原因
原文:2019-11-29-WPF-笔刷绑定不上可能的原因 title author date CreateTime categories WPF 笔刷绑定不上可能的原因 lindexi 2019-1 ...
-
2019-11-29-WPF-依赖属性绑定不上调试方法
原文:2019-11-29-WPF-依赖属性绑定不上调试方法 title author date CreateTime categories WPF 依赖属性绑定不上调试方法 lindexi 2019 ...
-
2019-8-2-WPF-依赖属性绑定不上调试方法
title author date CreateTime categories WPF 依赖属性绑定不上调试方法 lindexi 2019-08-02 19:56:32 +0800 2019-8-2 ...
-
2019-9-18-WPF-笔刷绑定不上可能的原因
title author date CreateTime categories WPF 笔刷绑定不上可能的原因 lindexi 2019-09-18 09:46:14 +0800 2019-9-18 ...
-
WPF使用附加属性绑定,解决data grid列绑定不上的问题
背景 需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景. 1.xaml 代码 <Da ...
-
【WPF】给TextBox添上Label
原文:[WPF]给TextBox添上Label 引言 在客户端开发中,要说出现频率大的控件,必定有TextBox的身影.然而在TextBox的旁边通常得有个基友Label,形影不离.为此,我们 ...
-
WPF TreeView HierarchicalDataTemplate
原文 WPF TreeView HierarchicalDataTemplate HierarchicalDataTemplate 的DataType是本层的绑定,而ItemsSource是绑定下层的 ...
-
WPF TreeView Indent 减少节点的缩进
www.swack.cn - 原文链接:WPF TreeView Indent 减少节点的缩进 问题 最近一个需求,需要在界面中实现Windows资源管理器TreeView的界面.但是我发现,我做出的 ...
-
已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。
错误:已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性. 或者 错误:反序列化操作“GetAllUserData ...
随机推荐
-
Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
-
DockerCon 2016 – 微软带来了什么?
根据Forrester的调查,接近半数的企业CIO在考虑IT架构的时候更乐于接受开源方案,这主要是基于低成本,避免供应商锁定和敏捷的需求:同时另外一家North Bridge的调研机构的调查显示,20 ...
-
ListView异步加载网络图片完美版之双缓存技术
本示例参考学习了一个国外的示例:http://code.google.com/p/android-imagedownloader/,有兴趣的同学下载研究一下. 问题描述:在这一篇博客中将会为大家讲解如 ...
-
Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json &; pickle 数据序列化
一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
-
【UVA】10012 - How Big Is It?(暴力)
使用DFS枚举所有的安排.每次加入后,当一个圆.他的立场是最大的,并已加入了圆环中的所有切线位置前面. 14383635 10012 option=com_onlinejudge&Itemid ...
-
[Kafka] - Kafka Java Consumer实现(一)
Kafka提供了两种Consumer API,分别是:High Level Consumer API 和 Lower Level Consumer API(Simple Consumer API) H ...
-
Hexo快速部署教程
一直有建立博客的需要,使用过Wordpress动态博客,一直访问速度比较慢,刚开始以为是空间域名的解析的问题,尝试使用Hexo静态博客,部署后感觉速度正常很多,特意发文快速部署教程 准备 本文是在wi ...
-
python私有属性和私有方法
私有属性和私有方法 01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私 ...
-
[Spark][python]从 web log 中提取出 UserID 作为key 值,形成新的 RDD
针对RDD, 使用 keyBy 来构筑 key-line 对: [training@localhost ~]$ cat webs.log 56.31.230.188 - 90700 "GET ...
-
Kattis之旅——Chinese Remainder
Input The first line of input consists of an integers T where 1≤T≤1000, the number of test cases. Th ...