WPF Treeview绑定,我是否显示不同的数据类作为节点子?

问题描述:

我试图显示一个组(文件扩展名和图标)(父),然后在WPF Treeview中找到该组(子级)中的所有文件。我可以让这些组在树形视图中显示,每个都有一个图标和文本,但是我不知道如何将这些文件显示为组的子组。这里是的GroupInfo类,问题是它包含的FileInfo不同的类和所有迄今在WPF树视图我已经阅读教程只使用一个数据类创建树项目:WPF Treeview绑定,我是否显示不同的数据类作为节点子?

public class GroupInfo 
{ 
    public GroupInfo() 
    { 
     alFiles = new ObservableCollection<FileInfo>(); 
    } 

    public string strExtension { get; set; } 
    public ImageSource icon {get; set;} 
    public string strDescription { get; set; } 

    public string TypeDescription 
    { 
     get 
     { 
      string s = strExtension; 
      s.Replace('.',' '); 
      s += " - " + strDescription; 
      return s; 
     } 

     set 
     { 

     } 
    } 

    public ObservableCollection<FileInfo> alFiles; 

    void LoadIcon() 
    { 
     //icon = BitmapFrame.Create(); 
    } 

    string GetDescription() 
    { 
     string strD = ""; 

     return strD; 
    } 
} 

我希望能够将alFiles中的所有FileInfo类显示为组节点的子节点。这是我的XAML:

<TreeView Margin="12,12,12,375" Name="trGroups" ItemsSource="{Binding Groups}" > 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type local:GroupInfo}" 
           ItemsSource="{Binding Groups}"> 
       <StackPanel Orientation="Horizontal" Margin="2"> 
       <Image Source="{Binding icon}" 
        Width="16" 
        Height="16" 
        SnapsToDevicePixels="True"/> 
        <TextBlock Text="{Binding TypeDescription}" Margin="5,0"/> 

       </StackPanel> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type local:FileInfo}" 
           ItemsSource="{Binding Groups.Files}"> 
       <StackPanel Orientation="Horizontal" Margin="2"> 
        <Image Source="{Binding icon}" 
        Width="16" 
        Height="16" 
        SnapsToDevicePixels="True"/> 
        <TextBlock Text="{Binding TypeDescription}" Margin="5,0"/> 

       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

在此先感谢....

有几件事情。首先,在你的GroupInfo类中,你应该为你的alFiles字段定义一个属性。这样可以和Bindings一起使用。

public ObservableCollection<FileInfo> alFiles; 
public ObservableCollection<FileInfo> AlFiles { get { return alFiles;} } 

接下来,在你的HierarchicalDataTemplate为的GroupInfo的ItemsSource时,应设置为AlFiles财产。

<HierarchicalDataTemplate DataType="{x:Type local:GroupInfo}" 
           ItemsSource="{Binding AlFiles}"> 

最后,除非FileInfo类有孩子们在他们要出现在TreeView,你可能要更改其模板只是一个<DataTemplate>代替<HierarchicalDataTemplate>

<DataTemplate DataType="{x:Type local:FileInfo}"> 
...     
</DataTemplate> 

希望这会有所帮助。

+0

Thankyou非常karmicpuppet,很好地工作。我已经在Win32/MFC/Windows Forms中编程了多年,但我决定使用WPF编写我的下一个应用程序,所以我正在学习使用每个控件。让我正确地做到这一点,对于每个子节点,您需要定义数据类型和项目源的,是的? – 2010-09-24 21:46:06

+0

我不确定我了解你的问题。但本质上,对于要在树视图中显示的每种类型的层次数据,必须为其ItemsSource被设置为Children集合的HierarchicalDataTemplate定义它。 – ASanch 2010-09-24 21:55:45

+0

因此,例如,您有一个Customer对象和一个Orders集合。每个Order对象都有一个Items集合。在这种情况下,您需要两个分层数据模板来在树视图中显示它:一个用于Customer类(其中ItemsSource = {Binding Orders}),另一个用于Order类(其中ItemsSource = {Binding Items})。 Item类可以简单地用普通的DataTemplate表示。希望这可以帮助。 – ASanch 2010-09-24 21:56:12