TreeView数据绑定

article/2025/9/23 20:27:09
http://www.cnblogs.com/mgen/archive/2011/07/21/2113152.html

[更新至V2]WPF:MVVM简单文件浏览器

image 

 

源代码下载  
2.0 下载页面 
1.0 下载页面 

注意:链接是微软SkyDrive页面,下载时请用浏览器直接下载,用某些下载工具可能无法下载 
源代码环境:Microsoft Visual C# 2008 Express

 

程序ViewModel名称是FileSystemObjectViewModel,它把文件和文件夹统一视为一类,并用FileSystemObjectType枚举来区分类型。ViewModel的逻辑很简单,这里就不再多说了,下面主要介绍一些其他需要注意的地方。

建议下载源代码作参考。

 

在2.0后:

程序使用.NET 4.0中Directory类型所支持的EnumerateDirectories和EnumerateFiles方法。

 

即时数据加载

文件浏览器最基本的性能考虑就应该是数据的即时加载,也就是说展开的文件夹视图都是在用户进行TreeViewItem的展开操作之后才被加载的,当然文件夹视图收缩后已经加载的数据是不会被扔掉的,下次展开会直接打开已经加载的数据。

那么每当一个ViewModel被建立后,初始化函数会进行这样一种操作,如果它是文件夹的话,快速检查当前文件夹是否有子成员(子文件夹或子文件),如果有的话,把一个特殊的没有任何值的特殊ViewModel加在当前ViewModel的Children属性中。这样WPF数据绑定会在当前生成的TreeViewItem的Items加入这个由特殊ViewModel所生成的另一个TreeViewItem,当前TreeViewItem左侧会显示“加号”,代表着当前文件夹有子成员,而事实上,子成员的具体内容只有当该文件夹被用户展开后才会被加载。

MVVM中View中是没有事件代码的,只有XAML,因此我们首先要利用TreeViewItem的IsExpanded依赖属性,同时ViewModel中也有IsExpanded属性,用双向的数据绑定使这两个属性可以互相设置(在本例中其实只存在View设置ViewModel的情况)。

 blog

 

参考FileSystemObjectViewModel中的OnExpanded方法:  

/// <summary>

/// 节点被展开后的操作

/// </summary>

protected virtual void OnExpanded()

{

    //是否有特殊节点

    if (HasSpecialChild)

    {

        //将要展开的节点拥有没有列举的子成员(第一次打开)

 

        //我们需要移除特殊节点,并将子文件夹加入到Children中

        RemoveSpecialChild();

 

        foreach (var dir in GetSubDirs())

            _Children.Add(new FileSystemObjectViewModel(dir, FileSystemObjectType.Folder));

        foreach (var file in GetSubFiles())

            _Children.Add(new FileSystemObjectViewModel(file, FileSystemObjectType.File));

    }

}

 

打开TreeView的虚拟化

  在.NET 3.5后,微软增加了VirtualizingStackPanel对TreeView的支持,虚拟化可以使TreeView得到更客观的性能,但是需要手动声明VirtualizingStackPanel的附加属性来使虚拟化起作用。

<TreeView VirtualizingStackPanel.IsVirtualizing="True"

          VirtualizingStackPanel.VirtualizationMode="Recycling"></TreeView>

VirtualizingStackPanel.VirtualizationMode默认是Standard:创建并丢弃项容器,应该尽可能的使用Recycling:重用项容器。

 

 

从文件或文件夹中提取图标

Windows Forms中有Icon.ExtractAssociatedIcon(MSDN:http://msdn.microsoft.com/en-us/library/system.drawing.icon.extractassociatedicon.aspx),但其缺点是无法从提取文件夹(包括磁盘根目录)的图标,并且在WPF程序中使用需要额外引用System.Drawing命名空间DLL。

因此使用SHGetFileInfo本地Windows API(MSDN:http://msdn.microsoft.com/en-us/library/bb762179.aspx),并将非托管图标资源转换成WPF的BitmapSource。

感谢互联网,就直接用这个链接所提供的代码来做SHGetFileInfo的执行:(http://stackoverflow.com/questions/6008600/get-program-icons),我把它包在一个叫IconExtractor的类中。

 

 

View

      主View:FileSystemView使用ObjectDataProvider来调用ViewModel(FileSystemObjectViewModel)的静态方法来索取当前系统的所有磁盘根目录并将结果绑定在TreeView的DataContext上。

  资源中还包括一个自定义的数据转换器(IconConverter)用来将FileSystemObjectViewModel转换成相应的文件或文件夹图标,并通过Image显示在TreeView的HierarchicalDataTemplate中。

 

FileSystemView:

<UserControl.Resources>

    <ObjectDataProvider x:Key="dataProvider"

                       ObjectType="loc:FileSystemObjectViewModel"

                       MethodName="GetSystemDrives"/>

 

    <loc:IconConverter x:Key="iconConverter" />

 

</UserControl.Resources>

<TreeView VirtualizingStackPanel.IsVirtualizing="True"

         VirtualizingStackPanel.VirtualizationMode="Recycling"

         DataContext="{Binding Source={StaticResource dataProvider}}"

         ItemsSource="{Binding Children}">

 

    <TreeView.ItemTemplate>

        <HierarchicalDataTemplate DataType="loc:FileSystemObjectViewModel"

                                 ItemsSource="{Binding Children}">

 

            <StackPanel Orientation="Horizontal">

                <Image Source="{Binding Converter={StaticResource iconConverter}}" />

                <TextBlock Text="{Binding DisplayName}" />

            </StackPanel>

 

        </HierarchicalDataTemplate>

    </TreeView.ItemTemplate>

 

    <TreeView.ItemContainerStyle>

        <Style TargetType="TreeViewItem">

            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />

        </Style>

    </TreeView.ItemContainerStyle>

 

</TreeView>


http://chatgpt.dhexx.cn/article/4BkIB6kP.shtml

相关文章

C#界面设计之树目录TreeView的使用

还是先上效果图&#xff1a; 主要代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;namespace TreeDemo {public partial c…

treeview 跨窗体拖拽功能的实现(一)

功能实现&#xff1a; 1.从工具窗体往任务窗体拖拽&#xff1b; 2.在任务窗体中改变节点的顺序&#xff1b; 3.右键复制节点&#xff0c;删除节点 工具窗体treeview1,&#xff1a; 涉及使用的事件&#xff1a;DragEnter&#xff0c; DragOver ,ItemDrag, NodeMouseDouble…

Virtual Treeview 安装以及入门

Virtual Treeview是一套Delphi下优秀的VCL控件&#xff0c;代码质量高&#xff0c;使用灵活、功能强大、性能非常好&#xff0c;可以用于表达Treeview和表格类数据。它的代码现在托管在google code上。 Virtual Treeview是一个“纯VCL”控件&#xff0c;这意味着它不是基于任何…

android treeview 树形结构,前端开发中,使用TreeView控件创建树形结构

原标题&#xff1a;前端开发中&#xff0c;使用TreeView控件创建树形结构 Wijmo是一款使用Type编写的新一代Java/HTML5控件集。它秉承触控优先的设计理念&#xff0c;在全球率先支持AngularJS&#xff0c;并提供性能卓越、零依赖的FlexGrid和图表等多个控件。 我们已经知道在Wi…

透透彻彻了解服务器技术

什么是服务器   服务器是一种高性能计算机&#xff0c;作为网络的节点&#xff0c;存储、处理网络上80&#xff05;的数据、信息&#xff0c;因此也被称为网络的灵魂。做一个形象的比喻&#xff1a;服务器就像是邮局的交换机&#xff0c;而微机、笔记本、PDA、手机等固定或移…

服务器的介绍

一 、IDC/机柜/物理server/云主机介绍 1.互联网数据中心 &#xff08;Internet Data Center&#xff09; 互联网数据中心图片 &#xff08;1&#xff09;IDC的简介 简称IDC&#xff0c;是电信部门利用已有的互联网通信线路、带宽资源&#xff0c;建立的标准化电信专业级机房环…

web服务器(技术讲解)

2.Web服务器&#xff08;技术讲解&#xff09; 1.ASP 微软&#xff1a;国内最早流行在HTML中嵌入了VB脚本&#xff0c;ASPCOM在ASP开发中&#xff0c;基本一个页面有几千行的业务代码&#xff0c;页面杂乱&#xff0c;维护成本非常高 2.PHP 开发速度很快&#xff0c;功能强…

关于服务器

初始服务器 云操作 以下是重装系统操作 出现黑窗口后&#xff1a; 输入—>sudo passwd命令–>输入密码&#xff08;密码不可见&#xff09;–>再次输入密码&#xff08;密码不可见&#xff09;–>su命令&#xff08;可使用root用户&#xff09;–>输入密码&…

云服务器简介

云服务器简介 一、云服务器二、云服务的灵魂——虚拟化三、云服务器ECS概念 一、云服务器 1、云服务器简介 云计算服务器又称为云服务器或云主机&#xff0c;是云计算服务体系中的一项主机产品&#xff0c;它有效地解决了传统物理主机与VPS服务中&#xff0c;存在的管理难度打…

服务器概述

1、什么是服务器&#xff1f; 服务器&#xff1a;分为服务器硬件和服务器软件。在硬件服务器&#xff08;计算机&#xff09;上安装服务器软件&#xff0c;才可以对外提供服务。 比如&#xff1a;让其他的计算机访问当前服务器&#xff0c;为其他的计算机提供服务。 &#xff…

服务器技术(三)--Nginx

Nginx介绍 Nginx是什么、适用场景 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 Nginx专为性能优化而开发&#xff0c;性能是其最重要的考量&#xf…

2022年,服务器领域十大技术趋势

2020年&#xff0c;疫情的全球爆发对上半年服务器市场的出货量带来了不小的影响。但是随着下半年疫情逐渐得到控制以及数字化需求的激增&#xff0c;全球服务器市场呈现出非常不错的增长态势。 目前来看&#xff0c;服务器依然是数字化转型和云计算、互联网等技术发展基础&…

服务器端技术

简介&#xff1a; 服务器分为web服务器和应用服务器。Web服务器是离客户端最近的服务器&#xff0c;负责监听和处理HTTP请求。应用服务器比web服务器更靠近后端&#xff0c;主要处理复杂的业务逻辑和数据库的访问。 如果是静态资源&#xff08;例如HTML页面或图片&#xff09;…

云计算服务器技术概述

云计算服务器技术概述 概述 云主机也叫云服务器ECS (Elastic Compute Server)&#xff0c;是一种按需获取的云端服务器&#xff0c;提供高可靠、弹性扩展的计算资源服务&#xff0c;可以根据需求选择不同规格的CPU、内存、操作系统、硬盘和网络来创建云主机&#xff0c;满足个性…

什么是服务器 ?服务器常见的系统和技术有哪些?

就像他的名字一样&#xff0c;服务器在网络上为不同用户提供不同内容的信息、资料和文件。可以说服务器就是Internet网络上的资源仓库&#xff0c;正是因为有着种类繁多数量庞大内容丰富的服务器的存在&#xff0c;才使得Internet如此的绚丽多彩。 服务器的种类和功能: (1) WW…

“东数西算”下数据中心的液冷GPU服务器如何发展?

以云计算、大数据、人工智能、高性能计算、数据分析、数据挖掘等为首的新兴技术凭借其优越的便利性和稳定性开始为服务器市场带来新的生机活力&#xff0c;其中以GPU为首的AI服务器在一定程度上不仅重构现行的产业结构&#xff0c;也为整个市场带来了新的有效增量。那么服务器的…

服务器技术基础

服务器技术基础 服务器是计算机的一种&#xff0c;比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其它客户机&#xff08;如PC机、智能手机、ATM等终端甚至是火车系统等大型设备&#xff09;提供计算或者应用服务。服务器具有高速的CPU运算能力、长时间的可靠运行…

1、NetBIOS简介

“网络基本输入&#xff0f;输出系统” &#xff08;Network Basic Input/Output System, NetBIOS&#xff09;是一种标准的应用程序编程接口&#xff08;A P I&#xff09;&#xff0c;1983年由Sytek公司专为IBM开发成功。NetBIOS为网络通信定义了一种编程接口&#xff0c;但却…

NetBIOS初步了解

NetBIOS定义及作用 NetBIOS&#xff1a;是Network Basic Input/Output System的简称&#xff0c;一般指用于局域网通信的一套API。作用是为了给局域网提供网络以及其他特殊功能&#xff0c;系统可以利用WINS服务、广播及Lmhost文件等多种模式将主机名解析为相应IP地址&#xf…

BIOS 常用网站 (持续更新中)

UEFI 官网 下载UEFI/PI/ACPI 等SPEC Welcome to Unified Extensible Firmware Interface Forum | Unified Extensible Firmware Interface Forumhttps://uefi.org/ AMD资料 (需账号权限) 下载AMD芯片资料 Login – AMD DevHubhttps://devhub.amd.com/ Rw工具 OS下读取寄存…