c# - 有没有办法绑定到像文件夹结构一样具有可变数量级别的 UWP TreeView?
问题描述
基本上我想用 TreeView 来表示一个文件夹结构。因此,可能有任意数量的子文件夹可供导航。这可以通过数据绑定来完成,还是这样的逻辑必须全部在代码中完成?谢谢。
解决方案
TreeView控件支持绑定到分层数据源。您可以为绑定使用定义一个自定义类。
我做了一个代码示例供您参考:
<Grid>
<TreeView x:Name="treeview" ItemsSource="{x:Bind storageFolders,Mode=OneWay}">
<TreeView.ItemTemplate>
<DataTemplate x:DataType="local:FolderInfo">
<TreeViewItem ItemsSource="{x:Bind subFolders}" Content="{x:Bind FolderName}"/>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<Button Content="folders" Click="Button_Click"></Button>
</Grid>
public class FolderInfo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,new PropertyChangedEventArgs(PropertyName));
}
}
private string _FolderName;
public string FolderName
{
get { return _FolderName; }
set
{
if (_FolderName != value)
{
_FolderName = value;
RaisePropertyChanged("FolderName");
}
}
}
public ObservableCollection<FolderInfo> subFolders { get; set; } = new ObservableCollection<FolderInfo>();
public override string ToString()
{
return FolderName;
}
}
public sealed partial class MainPage : Page
{
public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
FolderPicker folderPicker = new FolderPicker();
folderPicker.SuggestedStartLocation = PickerLocationId.ComputerFolder;
folderPicker.FileTypeFilter.Add(".txt");
var folder = await folderPicker.PickSingleFolderAsync();
var Folders = await GetFoldersAsync(folder);
foreach (var f in Folders)
{
storageFolders.Add(f);
}
}
private async Task<ObservableCollection<FolderInfo>> GetFoldersAsync(StorageFolder storageFolder)
{
var folders = await storageFolder.GetFoldersAsync();
ObservableCollection<FolderInfo> folderInfos = new ObservableCollection<FolderInfo>();
foreach (var f in folders)
{
folderInfos.Add(new FolderInfo() {FolderName=f.DisplayName,subFolders=await GetFoldersAsync(f) });
}
return folderInfos;
}
}
然后,当您有新的子文件夹时,您只需将其添加到storageFolders
集合中。
推荐阅读
- arrays - 如何在 ReactJS 中修改列表?
- android - 错误:Google Maps API 错误:正在运行的 android 应用程序中的 MissingKeyMapError
- reactjs - Typescript 中抽象泛型容器类的子类的装饰器
- apache-kafka - 无法使用 KSQL 创建流
- android - 为什么我的自定义 TextView 不继承字体?
- python - jupyter notebook:再次显示seaborn情节
- android - 在 setGridViewItemClickListener 中出现错误以及如何显示可绘制的图像
- slack-api - 用于获取和设置团队偏好的 API
- javascript - 在网格元素内垂直居中文本
- python - 请求避免 ddos 保护