【问题标题】:Best way to show all subfolders and its files in uwp在 uwp 中显示所有子文件夹及其文件的最佳方式
【发布时间】:2018-05-20 07:42:45
【问题描述】:

我已将所有子文件夹名称及其对应的文件名(来自本地文件夹)存储在一个类中。现在我想以一种好的方式展示它。并且还需要在用户选择它时访问该文件。实现它的最佳方法是什么?

 public class SubFolders
    {
        public string ItemName { get; set; }
        public ObservableCollection<SubFolderFiles> SubItemsList { get; set; }
    }

    public class SubFolderFiles
    {
        public string SubItemName { get; set; }
    }

【问题讨论】:

    标签: c# listview gridview tree uwp-xaml


    【解决方案1】:

    在 uwp 中显示所有子文件夹及其文件的最佳方式。

    对于这个需求,你需要创建一个比较完整的模型,如下图所示。

    上面是递归模型,我已经做了一个类来匹配它。

    public class Folder
    {
        public string FolderName { get; set; }
        private ObservableCollection<File> _subFiles;
        public ObservableCollection<File> SubFiles
        {
            get { return _subFiles ?? (_subFiles = new ObservableCollection<File>()); }
            set
            {
                _subFiles = value;
            }
        }
    
        private ObservableCollection<Folder> _subFolder;
        public ObservableCollection<Folder> SubFolders
        {
            get { return _subFolder ?? (_subFolder = new ObservableCollection<Folder>()); }
            set
            {
                _subFolder = value;
            }
        }
    
        public Folder()
        {
    
        }
    }
    public class File
    {
        public string FileName { get; set; }
    }
    

    如您所知,如果您想在ListView上显示一个文件夹中的文件夹和文件,您需要将它们转换为抽象列表视图项。

      public class Item
        {
            public string ItemName { get; set; }
            public ItemType IType { get; set; }
        }
        public enum ItemType
        {
            File,
            Folder
        }
    

    用法

    FolderService.cs

     public class FolderService
     {
         //  private Folder FolderModel;
         public async static Task<Folder> GetFolderInfoAsync(StorageFolder SelectFolder)
         {
             var FolderModel = new Folder();
    
             FolderModel.FolderName = SelectFolder.Name;
             IReadOnlyList<StorageFile> fileList = await SelectFolder?.GetFilesAsync();
    
             foreach (StorageFile file in fileList)
             {
                 var subFile = new File();
                 subFile.FileName = file.Name;
                 FolderModel.SubFiles.Add(subFile);
    
             }
             IReadOnlyList<StorageFolder> folderList = await SelectFolder?.GetFoldersAsync();
    
             foreach (StorageFolder folder in folderList)
             {
                 var subFolder = new Folder();
                 subFolder.FolderName = folder.Name;
                 FolderModel.SubFolders.Add(subFolder);
    
             }
    
             return FolderModel;
         }
         public async static Task<ObservableCollection<Item>>GetItems(StorageFolder SelectFolder)
         {
             var Model = await GetFolderInfoAsync(SelectFolder);
             var Items = new ObservableCollection<Item>();
             foreach (var file in Model.SubFiles)
             {
                 var item = new Item
                 {
                     ItemName = file.FileName,
                     IType = ItemType.File
                 };
                 Items.Add(item);
             }
             foreach (var folder in Model.SubFolders)
             {
                 var item = new Item
                 {
                     ItemName = folder.FolderName,
                     IType = ItemType.Folder
                 };
                 Items.Add(item);
             }
             return Items;
         }
     }
    

    ManPageViewModel.cs

    public class MainViewModel : INotifyPropertyChanged
    {
        public MainViewModel()
        {
        }
        public Command PickCommand => new Command(() => this.BtnClick());
    
        private async void BtnClick()
        {
            StorageFolder Selectfolder = ApplicationData.Current.LocalFolder;
            this.Items = await FolderService.GetItems(Selectfolder);
        }
        private ObservableCollection<Item> _items;
    
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string PropertyName = null)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        public ObservableCollection<Item> Items
        {
            get { return _items; }
            set
            {
                _items = value;
                OnPropertyChanged();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2019-06-19
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2015-03-29
      相关资源
      最近更新 更多