前言: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去动态改变了。