1

これを動作させようとしていますが、残念ながら私が間違っていることはわかりません!私はこれまでTreeViewとHierarchicalDataTemplateを含んでいることを尋ねられました。WPF TreeView with HierarchicalDataTemplateとObservableCollection with Childrenが含まれています

問題は次のとおりです。私はTreeViewを持っており、すべてのサブフォルダとファイルを含むフォルダ構造を表示したいと考えています。私は今、すべてのフォルダとファイルとのObservableCollectionフォルダをループが正しいデータを示しているコードで

public class FolderItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 

     if (handler != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    public FolderItem() 
    { 
     Files = new ObservableCollection<FileItem>(); 
     SubFolders = new ObservableCollection<FolderItem>(); 
    } 

    #region:PrivateVariables 
    private DirectoryInfo _Info; 
    private ObservableCollection<FileItem> _Files; 
    private ObservableCollection<FolderItem> _SubFolders; 
    #endregion 

    public DirectoryInfo Info 
    { 
     get { return _Info; } 
     set 
     { 
      _Info = value; 
      OnPropertyChanged("Info"); 
     } 
    } 
    public ObservableCollection<FileItem> Files 
    { 
     get { return _Files; } 
     set 
     { 
      _Files = value; 
      OnPropertyChanged("Files"); 
     } 
    } 
    public ObservableCollection<FolderItem> SubFolders 
    { 
     get { return _SubFolders; } 
     set 
     { 
      _SubFolders = value; 
      OnPropertyChanged("SubFolders"); 
     } 
    } 
} 
public class FileItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 

     if (handler != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #region:PrivateVariables 
    private FileInfo _Info; 
    #endregion 

    public FileInfo Info 
    { 
     get { return _Info; } 
     set 
     { 
      _Info = value; 
      OnPropertyChanged("Info"); 
     } 
    } 
} 

:そうするために、私は必要なアイテムを持つクラスを作成しました!

<TreeView ItemsSource="{Binding folders}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate ItemsSource="{Binding folders}" DataType="{x:Type local:FolderItem}"> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Info.Name}" /> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 

    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 

    <TreeView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Info.FullName}" FontSize="16" FontWeight="Bold" /> 
     </DataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

としても、それは動作しません別のHierarchicalDataTemplateと:私はXAMLに移動し、データを表示するためにたくさん試してみました。このOCで

public void StartExtraction(string sPath) 
{ 
    if (Directory.Exists(sPath)) 
    { 
     FolderItem newFolder = new FolderItem(); 
     newFolder.Info = new DirectoryInfo(sPath); 

     GetFileCount(sPath, newFolder); 

     Application.Current.Dispatcher.Invoke((Action)delegate() 
     { 
      ViewModel_ZVLB.folders.Add(newFolder); 
     }); 
    } 
} 

public void GetFileCount(string sPath, FolderItem actualFolder) 
{ 
    if (Directory.Exists(sPath)) 
    { 
     foreach (string fileName in Directory.GetFiles(sPath)) 
     { 
      FileItem newFile = new FileItem(); 
      newFile.Info = new FileInfo(fileName); 
      actualFolder.Files.Add(newFile); 
     } 

     foreach (string subFolder in Directory.GetDirectories(sPath)) 
     { 
      FolderItem newSubFolder = new FolderItem(); 
      newSubFolder.Info = new DirectoryInfo(subFolder); 
      actualFolder.SubFolders.Add(newSubFolder); 

      GetFileCount(subFolder, newSubFolder); 
     } 
    } 
} 

:私が使用するコードは次のようになります。

何か問題がありますか?それとも、ObservableCollectionsと連携していないのですか?

また、Visual Studio 2017のアップデート後に新しいエラーが発生しました.Tpye "ViewModel_ZVLB"の "folders"としてinstancemenberが必要です! (ドイツ語から翻訳された) これは私の問題と関係がありますか?

ありがとうございました!

答えて

0

私の意見では、Treeviewsで作業したい場合は、ObservableCollectionを子供用に1つだけ使用する方が簡単です。

まず、ツリーの各要素に対して汎用クラスを作成します。 FolderクラスとFileクラスは、それを継承します。ここで

public class TreeItem: INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 

     if (handler != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

public class FolderItem:TreeItem 
{ 
    public FolderItem() 
    { 
     Elems = new ObservableCollection<TreeItem>(); 
    } 

    #region:PrivateVariables 
    private DirectoryInfo _Info; 
    private ObservableCollection<TreeItem> _Elems; 
    #endregion 

    public DirectoryInfo Info 
    { 
     get { return _Info; } 
     set 
     { 
      _Info = value; 
      OnPropertyChanged("Info"); 
     } 
    } 

    public ObservableCollection<TreeItem> Elems 
    { 
     get { return _Elems; } 
     set 
     { 
      _Elems = value; 
      OnPropertyChanged("Elems"); 
     } 
    } 
} 
public class FileItem : TreeItem 
{ 

    #region:PrivateVariables 
    private FileInfo _Info; 
    #endregion 

    public FileInfo Info 
    { 
     get { return _Info; } 
     set 
     { 
      _Info = value; 
      OnPropertyChanged("Info"); 
     } 
    } 
} 

XAMLコードです:もちろん

<TreeView ItemsSource="{Binding folders}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate ItemsSource="{Binding Elems}" DataType="{x:Type local:FolderItem}"> 
       <TextBlock Text="{Binding Info.Name}" FontWeight="Bold"/> 
      </HierarchicalDataTemplate> 
      <DataTemplate DataType="{x:Type local:FileItem}"> 
       <TextBlock Text="{Binding Info.Name}" /> 
      </DataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

あなたの充填機能を更新する必要があります。

public void GetFileCount(string sPath, FolderItem actualFolder) 
    { 
     if (Directory.Exists(sPath)) 
     { 
      foreach (string fileName in Directory.GetFiles(sPath)) 
      { 
       FileItem newFile = new FileItem(); 
       newFile.Info = new FileInfo(fileName); 
       actualFolder.Elems.Add(newFile); 
      } 

      foreach (string subFolder in Directory.GetDirectories(sPath)) 
      { 
       FolderItem newSubFolder = new FolderItem(); 
       newSubFolder.Info = new DirectoryInfo(subFolder); 
       actualFolder.Elems.Add(newSubFolder); 

       GetFileCount(subFolder, newSubFolder); 
      } 
     } 
    } 
+0

はどうもありがとうございました!それは私のために完全に働いた! –

関連する問題