2017-12-06 2 views
0

모든 하위 폴더 이름과 해당 로컬 폴더의 파일 이름을 클래스에 저장했습니다. 이제 나는 그것을 좋은 방법으로 보여주고 싶다. 또한 사용자가 파일을 선택하면 해당 파일에 액세스해야합니다. 그것을 달성하는 가장 좋은 방법은 무엇입니까?uwp에있는 모든 하위 폴더와 해당 파일을 표시하는 가장 좋은 방법

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

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

답변

0

가장 좋은 방법은 UWP의 모든 하위 폴더와 파일을 표시합니다.

이 요구 사항의 경우 다음 그림과 같이 비교적 완전한 모델을 만들어야합니다.

enter image description here

은 위의 재귀 모델이며, 나는 그것을 일치하는 클래스를 만들 수 있습니다. 당신이 ListView에 하나 개의 폴더에, 당신은 추상적 목록보기 항목으로 그들을 컨버터에 필요한 폴더와 파일을 표시하려면

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; } 
} 

당신은, 아시다시피.

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(); 
     } 
    } 
} 
관련 문제