Multibinding в TreeView в WPF

Я хочу привязать treeview к такому классу:

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

другие классы ares:

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(""));
}

как я могу создать treeview, который показывает коллекцию файлов и папок

Я хочу использовать что-то вроде этого:

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

Итак, я получаю что-то вроде этого:

rootFolder

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

3 ответов


что именно ваш вопрос? Как их объединить? CompositeCollection.

EDIT: как упоминалось в комментариях, my Intuipic приложение делает что-то очень похожее на то, что вы спрашиваете. Вот скриншот:

alt text


Это довольно легко, учитывая ваше созвездие.

во-первых: Настройте свои классы. Вам не нужны два отдельных списка для файлов и папок в классе folders. Просто используйте один IList<Base_FileFolder> внутри класса Base_FileFolder (хороший ООП) и назовите его детьми!

тогда вам понадобится всего два шага:

  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-его простота.


вам нужно использовать Вам понадобится 3 вещи:

  1. A HierarchicalDataTemplate, как у вас есть, чтобы сделать parent+children и шаблон папок. вы можете использовать CompositeCollection здесь, чтобы объединить папки+файлы, но я не уверен в этом...возможно, вам придется добавить другое свойство в класс folder, которое возвращает объединение файлов и папок и называет его "дети" или что-то еще...
  2. DataTemplate для файлов шаблонов в дереве
  3. A TemplateSelector, чтобы сообщить дереву переключаться между шаблонами в зависимости от элемента в дереве. Вместо установки ItemTemplate на дереве установите для ItemTemplateSelector значение this.