WPF древовидная таблица данных - PullRequest
0 голосов
/ 31 января 2011

Допустим, у меня есть что-то вроде этого:

public class TopicFolder
    {
        #region Constants and Fields

        private readonly List<TopicInfo> folderContent;

        private readonly List<TopicFolder> subFolders;

        #endregion

...
    }

Как реализовать шаблон данных для такого типа? В настоящее время у меня есть:

<HierarchicalDataTemplate DataType="{x:Type local:TopicFolder}" ItemsSource="{Binding SubFolders}" >
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:TopicInfo}" ItemsSource="{Binding FolderContent}">
            <TextBlock Text="{Binding TopicName}"/>
        </HierarchicalDataTemplate>

Но это не показывает никакого содержимого папки. Кажется, что второй шаблон DataType должен быть локальным: TopicFolder, но это не разрешено WPF.

Есть предложения?

UPD: TreeView привязан к ObservableCollection таким образом:

ItemsSource="{Binding Path=Folders}"

P.S .: Это определенно не проблема приватности / публичности / свойств. У меня есть соответствующие общедоступные свойства для опубликованных полей. Нет ошибок привязки в выводе, просто не отображаются элементы FolderContent.

1 Ответ

1 голос
/ 31 января 2011

Редактировать:

Для отображения подпапок и содержимого можно использовать MultiBinding или, если вы не возражаете, папки и содержимое могут отображаться в определенном порядке.Я бы предложил использовать составной шаблон , для которого вы удаляете свои SubFolders и FolderContent и заменяете его набором объектов, которые реализуют составной интерфейс (см. Статью в вики).

Созданиесвойство объединять две коллекции, так что вы можете связать его, является плохой практикой.

Пример составного шаблона:

public interface ITopicComposite
{
    // <Methods and properties folder and content have in common (e.g. a title)>

    // They should be meaningful so you can just pick a child
    // out of a folder and for example use a method without the
    // need to check if it's another folder or some content.
}

public class TopicFolder : ITopicComposite
{
    private readonly ObservableCollection<ITopicComposite> children = new ObservableCollection<ITopicComposite>();
    public ObservableCollection<ITopicComposite> Children
    {
        get { return children; }
    }

    //...
}

public class TopicInfo : ITopicComposite
{
    //...
}
...