Как добавить дополнительные шаблоны элементов в расширенное древовидное представление WPF - PullRequest
2 голосов
/ 28 сентября 2011

Я пытаюсь настроить класс-потомок Treeview, который можно использовать в качестве общего шаблона для всех экземпляров Treeview в моем приложении, но с дополнительным форматированием и шаблонами для каждого экземпляра.

Для базы:У меня есть UserControl, который происходит от Treeview, с общими стилями и единым стандартным шаблоном данных

<TreeView x:Class="BaseTreeView" ... >
    <TreeView.ItemContainerStyle> ... </TreeView.ItemContainerStyle>
    <TreeView.Resources>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}"  DataType="{x:Type local:BaseTreeViewItem}">
            <TextBlock Text="{Binding Caption}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

Затем в каждом окне я использую этот расширенный Treeview и добавляю дополнительные шаблоны данных для конкретных TreeviewItems, которые яdisplaying.

например,

<Window x:Class="Window1" ... >
    ...
    <BaseTreeView ItemsSource="{Binding RootTreeItems}" >
        <MyTreeView.Resources>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}"  DataType="{x:Type ExtendedTreeViewItem1}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="Images/Image1.png" />
                    <TextBlock Text="{Binding Caption}" />
                </StackPanel>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type ExtendedTreeViewItem2}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="Images/Image2.png" />
                    <TextBlock Text="{Binding Caption}" />
                </StackPanel>
            </DataTemplate>
        </MyTreeView.Resources>
    </BaseTreeView>
    ...
</Window>

Компилируется нормально, но во время выполнения я получаю ошибку

"'Установить свойство' System.Windows.ResourceDictionary.DeferrableContentбросил исключение.Номер строки '27' и позиция строки '59'. "

" Невозможно повторно инициализировать экземпляр ResourceDictionary. "

Есть ли способ обойти это, или кто-то может предложить лучшеспособ настроить базовый шаблон дерева и несколько версий потомков.

1 Ответ

0 голосов
/ 15 ноября 2012

Вы можете попробовать переместить ваши шаблоны на <Window.Resources> вместо <MyTreeView.Resources>

Если это не сработает, возможно, использование DataTemplateSelector лучше всего подходит для вашего случая. Вы можете создать класс DataTemplateSelector следующим образом:

public class ExtendedTreeViewTemplateSelector : DataTemplateSelector
{
    public DataTemplate ExtendedTreeViewItem1Template { get; set; }
    public DataTemplate ExtendedTreeViewItem2Template { get; set; }


    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is ExtendedTreeViewItem1)
            return ExtendedTreeViewItem1Template;
        if (item is ExtendedTreeViewItem2)
            return ExtendedTreeViewItem2Template;
    }
}

А затем используйте его в своем XAML следующим образом:

<Window x:Class="Window1" ... >
    <Window.Resources>
        <HierarchicalDataTemplate x:Key="extendedTreeViewItem1Template" ItemsSource="{Binding Children}"  DataType="{x:Type ExtendedTreeViewItem1}">
            <StackPanel Orientation="Horizontal">
                <Image Source="Images/Image1.png" />
                <TextBlock Text="{Binding Caption}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <DataTemplate x:Key="extendedTreeViewItem2Template" DataType="{x:Type ExtendedTreeViewItem2}">
            <StackPanel Orientation="Horizontal">
                <Image Source="Images/Image2.png" />
                <TextBlock Text="{Binding Caption}" />
            </StackPanel>
        </DataTemplate>
        <selector:ExtendedTreeViewTemplateSelector x:Key="treeViewTemplateSelector"
                                                   ExtendedTreeViewItem1Template="{StaticResource extendedTreeViewItem1Template}"
                                                   ExtendedTreeViewItem2Template="{StaticResource extendedTreeViewItem2Template}" />
    </Window.Resources>
    ...
    <BaseTreeView ItemsSource="{Binding RootTreeItems}"
                  ItemTemplateSelector={StaticResource treeViewTemplateSelector}" />
    ...
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...