2013-05-21 33 views
0

这里是我的代码创建一个TreeView,有多个级别与复选框显示。 我无法使用以下代码在文件夹下显示文件。我的Xaml导致这个问题出了什么问题?或者它不能完成?WPF Treeview多层次使用HierarchialdataTemplate

Window1.xaml

<Window x:Class="TreeViewSample.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TreeViewSample" 
    Title="Window1" Height="500" Width="800"> 
<DockPanel> 
    <TreeView DockPanel.Dock="Left" Width="300" ItemsSource="{Binding Folders}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type local:Folder}" ItemsSource="{Binding Folders}"> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox Margin="2" /> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type local:File}" ItemsSource="{Binding Files}"> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox Margin="2" /> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
    <Grid></Grid> 
</DockPanel> 

Window1.xaml.cs代码隐藏构造

this.DataContext = new Window1ViewModel(); 

Window1ViewModel

public class Window1ViewModel : INotifyPropertyChanged 
{ 
    public Window1ViewModel() 
    { 
     _folders = new ObservableCollection<Folder>(Sample.GetFoldersAndFiles()); 
    } 

    private ObservableCollection<Folder> _folders; 

    public ObservableCollection<Folder> Folders 
    { 
     get { return _folders; } 
     set { _folders = value; OnPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName]string propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

} 

样本数据和类

public class Sample 
{ 
    public static List<Folder> GetFoldersAndFiles() 
    { 

     var folders = new List<Folder>(); 

     Folder folder1 = new Folder { Name ="Folder 1" }; 
     Folder folder2 = new Folder { Name = "Folder 2" }; 
     Folder folder3 = new Folder { Name = "Folder 3" }; 
     Folder folder11 = new Folder { Name = "Folder 11" }; 
     Folder folder12 = new Folder { Name = "Folder 12" }; 
     Folder folder22 = new Folder { Name = "Folder 22" }; 

     folder1.Folders.Add(folder11); 
     folder1.Folders.Add(folder12); 
     folder2.Folders.Add(folder22); 

     File file1 = new File { Name="File 1" }; 
     File file2 = new File { Name = "File 2" }; 
     File file3 = new File { Name = "File 3" }; 
     File file4 = new File { Name = "File 4" }; 
     File file11 = new File { Name = "File 11" }; 
     File file31 = new File { Name = "File 31" }; 

     file1.Files.Add(file11); 
     file3.Files.Add(file31); 

     folder1.Files.Add(file1); 
     folder1.Files.Add(file2); 
     folder2.Files.Add(file3); 
     folder3.Files.Add(file4); 

     folders.Add(folder1); 
     folders.Add(folder2); 
     folders.Add(folder3); 


     return folders; 

    } 
} 


public class Folder 
{ 
    public Folder() 
    { 
     Folders = new List<Folder>(); 
     Files = new List<File>(); 
    } 

    public string Name { get; set; } 
    public ICollection<Folder> Folders { get; set; } 
    public ICollection<File> Files { get; set; } 

} 

public class File 
{ 
    public File() 
    { 
     Files = new List<File>(); 
    } 

    public string Name { get; set; } 
    public Folder Folder { get; set; } 
    public ICollection<File> Files { get; set; } // This groups files together under a single file. 
} 

我期待有如下的树:

  • Folder1中

    • Folder11
    • Folder12
    • 文件1
    • 文件2
  • 文件夹2

    • Folder22
    • 文件3 等,

回答

0

您可以使用CompositeCollectionmsdn)。

首先您应该添加到Folder类属性,该属性将返回CompositeCollection

public class Folder 
{ 
    public Folder() 
    { 
     Folders = new List<Folder>(); 
     Files = new List<File>(); 
    } 

    public string Name { get; set; } 
    public ICollection<Folder> Folders { get; set; } 
    public ICollection<File> Files { get; set; } 

    public IEnumerable Items 
    { 
     get 
     { 
      var items = new CompositeCollection(); 
      items.Add(new CollectionContainer { Collection = Folders }); 
      items.Add(new CollectionContainer { Collection = Files }); 
      return items; 
     } 
    } 
} 

第一步后,您应该修改HierarchicalDataTemplate如下:

<HierarchicalDataTemplate DataType="{x:Type local:Folder}" ItemsSource="{Binding Items}"> 
    <StackPanel Orientation="Horizontal"> 
     <CheckBox Margin="2" /> 
     <TextBlock Text="{Binding Name}" /> 
    </StackPanel> 
</HierarchicalDataTemplate>     
<HierarchicalDataTemplate DataType="{x:Type local:File}"> 
    <StackPanel Orientation="Horizontal"> 
     <CheckBox Margin="2" /> 
     <TextBlock Text="{Binding Name}" /> 
    </StackPanel> 
</HierarchicalDataTemplate> 
+0

感谢它。正如你提到的那样,我的确做得很好 – isakavis

0

得到它的工作。以下是我所做的改变。

 public IList Children 
    { 
     get 
     { 
      return new CompositeCollection() 
     { 
      new CollectionContainer() { Collection = Folders }, 
      new CollectionContainer() { Collection = Files } 
     }; 
     } 
    } 

       <HierarchicalDataTemplate DataType="{x:Type local:Folder}" ItemsSource="{Binding Children}"> 

这是给我的解决方案的链接:

WPF Treeview Databinding Hierarchal Data with mixed types