Как программно изменить HirerachicalDataTemplate, связанный с WPF TreeView, во время выполнения? - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть элемент управления TreeView в моем окне WPF.Я даю только соответствующий XAML из моего окна.

<Window.Resources>
        <HierarchicalDataTemplate x:Key="HierarchicalTemplate" ItemsSource="{Binding SubOrgUnitItems}">
            <StackPanel Orientation="Horizontal">
                <Image Height="16" Source="{Binding ImagePath}" Stretch="Fill" Width="16"/>
                <TextBlock Text="{Binding OrgUnitName}" Name="treeText" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </Window.Resources>



<TreeView Margin="10,35,10,10" BorderThickness="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto"
                      IsTabStop="True" Name="orgTreeView" ItemsSource="{Binding}"  ItemTemplate="{DynamicResource HierarchicalTemplate}" TabIndex="700" SelectedItemChanged="orgTreeView_SelectedItemChanged" />

Когда Коллекция организаций привязана к DataContext из TreeView, элементы отображаются со значением OrgUnitName в виде текстана каждом узле.Теперь во время выполнения я хочу видеть значение какого-либо другого свойства в виде текста на каждом узле.например, OrgUnitCode вместо OrgUnitName.Оба свойства объявлены в классе модели представления, связанном с древовидным представлением.

Как я могу сделать это программно во время выполнения?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

Вы должны использовать HierarchicalDataTemplateSelector.

Определите два разных HierarchicalDataTemplate (как вы это сделали).

Унаследуйте свой пользовательский класс селектора от DataTemplateSelector, переопределите его метод SelectTemplate и поместите туда логику выбора. Этот метод будет возвращать правильный шаблон в каждом случае.

Создать ресурс (класс Custom Selector) в файле xaml.

Установите TreeView s ItemTemplateSelector в качестве ресурса статического селектора.

См. Простой пример здесь: Ссылка

0 голосов
/ 20 сентября 2011

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

Я добавил еще HirerachicalDataTemplate и TreeView. Новый шаблон использует свойство OrgUnitCode. Новое представление дерева использует новый шаблон.

<HierarchicalDataTemplate x:Key="HierarchicalTemplateUsingCode" ItemsSource="{Binding SubOrgUnitItems}">
            <StackPanel Orientation="Horizontal">
                <Image Height="16" Source="{Binding ImagePath}" Stretch="Fill" Width="16"/>
                <TextBlock Text="{Binding OrgUnitCode}" Name="treeText" />
            </StackPanel>
        </HierarchicalDataTemplate>



<TreeView Margin="10,35,10,10" BorderThickness="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto"
                      IsTabStop="True" Name="orgTreeViewCode" ItemsSource="{Binding}"  ItemTemplate="{DynamicResource HierarchicalTemplateUsingCode}" TabIndex="700" SelectedItemChanged="orgTreeViewCode_SelectedItemChanged"  Visibility="Hidden"/>

Во время выполнения, когда я хочу увидеть значение свойства OrgUnitCode в виде текста на узле, я просто делаю видимым новое дерево и скрываю первое (упомянутое в вопросе). Таким образом, делая вид дерева видимым / невидимым, я могу достичь того, чего хотел.

...