Древовидное мультисвязывание в wpf - PullRequest
6 голосов
/ 20 августа 2010

Я хочу привязать древовидное представление к классу, подобному следующему:

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

Как создать древовидное представление, отображающее файлы и папкиcollection

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

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

, поэтому я получаю Somethign так:

rootFolder

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

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Какой именно у вас вопрос?Как их совместить?CompositeCollection.

РЕДАКТИРОВАТЬ: как упоминалось в комментариях, мое приложение Intuipic делает нечто очень похожее на то, что вы запрашиваете.Вот скриншот:

alt text

1 голос
/ 06 сентября 2010

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

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

Тогда вам потребуется всего лишь два шага:

  1. Два иерархических шаблона данных

    <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 голосов
/ 21 августа 2010

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

  1. шаблон иерархической структуры данных, как и у вас, для родительских + дочерних элементов и шаблонов папок.вы МОЖЕТЕ иметь возможность использовать CompositeCollection здесь для объединения папок + файлов, но я не уверен в этом ... вам, возможно, придется добавить другое свойство в ваш класс папок, которое возвращает объединение файлов и папок, и вызвать его "Children "или что-то еще ...
  2. A DataTemplate для файлов шаблонов в дереве
  3. A TemplateSelector указывает дереву переключаться между шаблонами в зависимости от элемента в дереве.Вместо того, чтобы устанавливать ItemTemplate для дерева, установите ItemTemplateSelector на это.
...