首页 > 解决方案 > 有没有办法绑定到像文件夹结构一样具有可变数量级别的 UWP TreeView?

问题描述

基本上我想用 TreeView 来表示一个文件夹结构。因此,可能有任意数量的子文件夹可供导航。这可以通过数据绑定来完成,还是这样的逻辑必须全部在代码中完成?谢谢。

标签: c#xamlvisual-c++uwp

解决方案


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集合中。


推荐阅读