WPF中的TreeView多绑定问题

6
我希望将一个类绑定到树形视图中,就像这个类一样:
public class Folder : Base_FileFolder
{
    public Folder()
    {
        Folders = new ObservableCollection<Folder>();
        Files = new ObservableCollection<File>();
    }
    public ObservableCollection<Folder> Folders { get; set; }
    public ObservableCollection<File> Files { get; set; }
}

其他类别包括:
public class File : Base_FileFolder
{
}

public class Base_FileFolder : DependencyObject
{
    public string Name
    {
        get { return (string)GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }
    public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Base_FileFolder), new UIPropertyMetadata(""));
}

我如何创建一个显示文件和文件夹集合的树形视图?

我想使用类似于这样的东西:

 <HierarchicalDataTemplate
 DataType="{x:Type model:Folder}"
 ItemsSource="{Binding Childs}">   
 <DockPanel>
       <Label Content="{Binding Name}"/>    </DockPanel>
 </HierarchicalDataTemplate>

so I get Somethign like this:

rootFolder

|
|-File
|-File
|-Folder
  |-File
  |-File
  |-Folder
    |-File

1
这正是我遇到的完全相同的问题,当我想用XDocument填充一个treeview并显示每个元素的每个属性时,我可以迭代一个元素或所有元素的属性,但对每个元素迭代所有元素和所有属性却让我感到困惑。我不记得我做了什么,但浪费了我很多时间。 - Jimmy Hoffa
3个回答

2
你的问题是什么?如何组合它们?CompositeCollection
编辑:如评论中所提到的,我的Intuipic应用程序与您请求的非常相似。以下是屏幕截图:

alt text


Intuipic(http://intuipic.codeplex.com/)是我一段时间前写的一个项目,可以实现这个功能。你可能想要去看看它。 - Kent Boogaart
@John:如果你真的仔细看,你会发现它显示了一个文件夹和文件树视图,就像OP所请求的那样。 - Kent Boogaart
我很在意,只是不想花时间去运行clickonce安装程序或浏览源代码树来看看可能有或没有任何有用的东西。Codeplex网站上没有任何截图或任何我可以找到的东西显示像海报所要求的树视图。如果您说“你可能想看看该项目中的文件x\y\z,以了解我是如何做到的”,则您的原始注释会更有帮助。 - John Gardner
@John:你可能没有动力去看,但我相信原帖作者会看的。 - Kent Boogaart
没必要挑剔。我已经忘记了它的确切功能,因为它是我写了三年前。它做的是以分层方式绑定到“TreeView”的异构项集合的显示。我相信OP可以将其推广到包括文件。 - Kent Boogaart
显示剩余2条评论

1

考虑到你的星座,这很容易。

首先:调整你的类。你不需要在文件夹类中为文件和文件夹分别使用两个单独的列表。只需在 Base_FileFolder 类内部使用一个 IList<Base_FileFolder>,并将其命名为 Children(好的 OOP)。

然后,你只需要再进行两个步骤:

  1. 两个HierarchicalDataTemplates

    <HierarchicalDataTemplate DataType="{x:Type FolderNode}"  ItemsSource="{Binding Path=Children}">
        <Grid>
            <TextBlock Text="{Binding FolderName}" />
        </Grid>
    </HierarchicalDataTemplate>
    
    <HierarchicalDataTemplate DataType="{x:Type FileNode}"  ItemsSource="{Binding Path=Children}">
        <Grid>
            <TextBlock Text="{Binding FileName}" />
        </Grid>
    </HierarchicalDataTemplate>
    
  2. 以及像这样的TreeView

    <TreeView Name="TreeViewFileTree" ItemsSource="{rootFolder.Children}" />
    

就是这样。WPF的强项在于它的简洁性。


0

你需要使用以下3个东西:

  1. 一个类似你所拥有的HierarchicalDataTemplate,用来实现父节点和子节点,并为文件夹提供模板。在这里,你可能可以使用CompositeCollection来合并文件夹和文件,但我对此不确定...你可能需要在你的文件夹类中添加另一个返回文件和文件夹的并集的属性,并将其命名为"Children"或其他名称...
  2. 一个用于树状结构中文件的数据模板
  3. 一个模板选择器,用于告诉树状结构根据树中的项目切换模板。不要在树上设置ItemTemplate,而是将ItemTemplateSelector设置为此。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接