5、采用MVVM方式实现WPF的TreeView

前言:TreeView可以说是很常见的一个控件,大部分软件不管是客户端还是网页都会有个左侧树型结构的控件,用于承载树形数据,下面就TreeView在MVVM下的使用写两篇小记,一篇是绑定后台数据,一篇是选中事件后获取路由节点信息。

说明:有关MVVM的介绍,可以导航到这篇文章了解下wpf mvvm小记

其中MVVM使用prism框架,这样就不需要自己重新去实现MVVM的功能了,prism中都封装好了。

Prism的简单介绍可以看笔者之前的文章了解下。

一、目录结构

二、测试实现功能

读取本地资源管理器中指定路径下的目录结构,然后加载到TreeView容器中。

根据指定文件读取目录树结构程序可以导航到这篇文章中指定路径获取路径下目录结构

2.1 XAML代码

<UserControl x:Class="WpfPrismBlankApp_NetCore.Views.CustomView1"
             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:WpfPrismBlankApp_NetCore.Views"
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             mc:Ignorable="d" 
             d:DesignHeight="400" d:DesignWidth="300">
    <Grid Background="Beige">
        <TreeView Width="400" Margin="0" ItemsSource="{Binding DirInfo}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=DirChildren}">
                    <TextBlock Text="{Binding DirName}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView> 
    </Grid>
</UserControl>

2.2 VM代码

using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.IO;
using WpfPrismBlankApp_NetCore.Model;

namespace WpfPrismBlankApp_NetCore.ViewModels
{
    public class CustomView1ViewModel : BindableBase
    {
        private string _currentTime;
        public string CurrentTime
        {
            get { return _currentTime; }
            set { SetProperty(ref _currentTime, value); }
        }

        private List<DirInfo> _dirInfo;
        public List<DirInfo> DirInfo
        {
            get { return _dirInfo; }
            set { SetProperty(ref _dirInfo, value); }
        }

        private DelegateCommand _getCurrentTimeCommand;

        public CustomView1ViewModel()
        {
            string s = @"F:\test";
            List<DirInfo> files = new List<DirInfo>(); 
            DirInfo = ListDirectory(files, s);
        }

        public DelegateCommand GetCurrentTimeCommand =>
            _getCurrentTimeCommand ?? (_getCurrentTimeCommand = new DelegateCommand(ExecuteGetCurrentTimeCommand));

        void ExecuteGetCurrentTimeCommand()
        {
            CurrentTime = DateTime.Now.ToString();
        }

        /// <summary>
        /// 220305 komla 
        /// </summary>
        /// <param name="list"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        private static List<DirInfo> ListDirectory(List<DirInfo> list,string path)
        {
            DirectoryInfo folder = new DirectoryInfo(@path);
             
            foreach (FileInfo NextFile in folder.GetFiles())
            { 
                list.Add(new DirInfo
                {
                    FileName = NextFile.Name
                });
            }
 
            foreach (DirectoryInfo NextFolder in folder.GetDirectories())
            {

                list.Add(new DirInfo
                {
                    DirName = NextFolder.Name,
                    DirChildren = ListDirectory(new List<DirInfo>(), NextFolder.FullName)
                }); 

            }
            return list;
        }
    }
}

三、效果

四、说明

前后端分离,完全靠数据驱动前端页面,当然这里的List在使用时应该换成obs开头的实现了通知的那个集合类型,这样可以在改动数据的时候通知到界面的TreeView去动态改变了。

### 回答1: MVVM(Model-View-ViewModel)是一种设计模式,以一种分离职责并且高可测试性的方式构建应用程序的UI层。在WPF应用程序中,MVVM模式是非常流行的,它将UI控件的状态和行为从UI层分离出来,使得代码更容易测试和维护。 在使用MVVM模式实现WPF TreeView中节点的添加、重命名、删除、上/下移动时,我们需要定义以下几个重要的类和接口: 1. Model:表示我们的业务逻辑,比如树形结构中节点的保存和查询,在这个例子中,我们可以定义一个Node类来表示树形结构中的一个节点。 2. View:表示WPF应用程序中的UI层。在本例中,我们可以在MainWindow.xaml中创建一个TreeView控件用于显示树形结构中的节点。 3. ViewModel:是连接Model和View的纽带,使用它来协调模型和视图之间的交互。在这个例子中,我们需要定义一个NodeViewModel类来表示一个节点在UI中的状态和行为,比如属性IsExpanded用于表示该节点是否展开,方法AddNode用于添加子节点等。 通过ViewModel类,我们可以实现TreeView中节点的添加、重命名、删除、上/下移动等功能。具体实现可以通过ICommand接口和Command类来完成,它们可以实现对操作的数据绑定以及实现对控件的事件处理。 总之,使用MVVM模式可以让我们更好地管理WPF应用程序中的UI层,提高代码的可测试性和可维护性,它是一种非常强大和实用的设计模式。 ### 回答2: MVVM模式是一种用于构建用户界面的软件架构模式,在WPF中得到了广泛应用。在MVVM模式中,界面(View)、业务逻辑(ViewModel)和数据模型(Model)是分开的,提供了更好的可测试性和更好的代码复用性。 在WPF TreeView控件中,我们可以通过MVVM模式实现对节点的添加、重命名、删除以及上(下)移动操作。首先,我们需要定义TreeViewItemViewModel类作为TreeView节点的ViewModel,该类包含节点的名称、子节点集合以及节点的相关操作方法。 在实现TreeView节点的添加操作时,我们需要向TreeViewItemViewModel中的子节点集合中添加一个新的节点,并且将其同步更新到TreeView中。在重命名节点操作中,根据节点名称的改变,我们需要同步更新对应节点在TreeView中的名称。在删除节点操作中,我们需要移除当前节点以及其所有的子节点,并同步更新TreeView。在上(下)移动节点操作中,我们需要判断当前节点的位置以及上(下)一个兄弟节点的位置,并将其在TreeView中进行移动。 总之,通过使用MVVM模式实现WPF TreeView中节点的添加、重命名、删除和上(下)移动操作,可以提高程序的可维护性、可扩展性以及代码复用性,使得程序的开发效率和代码质量得到了提高。 ### 回答3: MVVM是一种常用的软件架构模式,用于分离用户界面的开发和业务逻辑的开发,使程序更加可维护和可测试。在WPF应用程序中,MVVM模式也非常常用。在MVVM模式中,View(视图)与ViewModel(视图模型)通过数据绑定来进行通信。ViewModel处理业务逻辑,View负责UI的呈现和交互。 本程序在MVVM模式下实现了对WPF TreeView中节点的添加、重命名、删除、上(下)移动功能。具体实现如下: 1. 添加节点:在ViewModel中维护一个ObservableCollection,用于存储TreeView的节点。View中有一个Button,绑定Command到ViewModel中的AddCommand。当用户点击Button时,会触发AddCommand的Execute方法,创建一个新的TreeViewItem,并加入到ObservableCollection中。通过数据绑定,TreeView实时地显示所有节点。 2. 重命名节点:在View中,为TreeViewItem绑定了一个ContextMenu,包括了重命名和删除两个选项。当用户右键点击选中的TreeViewItem,弹出ContextMenu。当用户选择“重命名”选项时,会触发重命名命令的Execute方法,弹出一个窗口供用户输入新的节点名称。当用户确认新名称时,ViewModel中的节点名称更新,TreeView实时刷新节点名称。 3. 删除节点:删除节点也是在ContextMenu中实现。当用户选择“删除”选项时,会触发删除命令的Execute方法,从ViewModel中的ObservableCollection中移除选中的节点。TreeView实时刷新节点显示。 4. 移动节点:在View中,为TreeViewItem绑定了两个Button,分别代表上移和下移。当用户点击上移按钮时,会触发上移命令的Execute方法,将当前选中节点与上一个节点交换位置。当用户点击下移按钮时,会触发下移命令的Execute方法,将当前选中节点与下一个节点交换位置。 综上所述,该程序通过使用MVVM模式,实现了对WPF TreeView中节点的添加、重命名、删除、上(下)移操作,提高了程序的可维护性和可测试性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值