Добрый день! После того, как я разобрался с binding вот в этой теме, я решил вынести описание TreeListView в отдельный UserControl. Начал, собственно, с создания UserControl'a, унаследовал его от TreeView (как и в оригинале). Файл Xaml выглядит так: Код | <TreeView x:Class="Dem0n13.Controls.TreeListView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" MinHeight="60" MinWidth="60" xmlns:local="clr-namespace:Dem0n13.Controls"> <TreeView.Resources> <!--Реализация кнопки-плюса--> <Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}"> <Setter Property="Focusable" Value="False"/> <Setter Property="Width" Value="19"/> <Setter Property="Height" Value="13"/> <!--Шаблон кнопки (плюс)--> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}" x:Name="ToggleButtonArea"> <Image Name="MinimizedIconImg" Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=MinimizedIcon}"/> <!--Триггер на раскрытый элемент (минус)--> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}" x:Name="ToggleButtonArea"> <Image Name="MaximizedIconImg" Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=MaximizedIcon}"/> </ControlTemplate> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
<!--Отступы--> <local:LevelToIndentConverter x:Key="LevelToIndentConverter"/>
<!--Реализация первой ячейки--> <DataTemplate x:Key="CellTemplateName"> <DockPanel> <ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}" Margin="{Binding Level, Converter={StaticResource LevelToIndentConverter},RelativeSource={RelativeSource AncestorType={x:Type local:TreeListViewItem}}}" IsChecked="{Binding Path=IsExpanded,RelativeSource={RelativeSource AncestorType={x:Type local:TreeListViewItem}}}" ClickMode="Press"/> <TextBlock Text="{Binding Path=Name}"/> </DockPanel> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=HasItems, RelativeSource={RelativeSource AncestorType={x:Type local:TreeListViewItem}}}" Value="False"> <Setter TargetName="Expander" Property="Visibility" Value="Hidden"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate>
<!--Реализация второй ячейки--> <DataTemplate x:Key="CellTemplateIs"> <Button Content="{Binding Path=Path1}"/> </DataTemplate>
<!--Описание столбцов--> <GridViewColumnCollection x:Key="gvcc"> <GridViewColumn Header="Name" CellTemplate="{StaticResource CellTemplateName}" /> <GridViewColumn Header="Второй столбец" CellTemplate="{StaticResource CellTemplateIs}" /> </GridViewColumnCollection>
<!--Описание шаблона каждого элемента--> <Style TargetType="{x:Type local:TreeListViewItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type local:TreeListViewItem}"> <StackPanel> <!--Заголовок--> <Border Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> <GridViewRowPresenter x:Name="PART_Header" Content="{TemplateBinding Header}" Columns="{StaticResource gvcc}" /> </Border> <!--Все, что ниже--> <ItemsPresenter x:Name="ItemsHost"/> </StackPanel> <ControlTemplate.Triggers> <Trigger Property="IsExpanded" Value="false"> <Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="HasHeader" Value="false"/> <Condition Property="Width" Value="Auto"/> </MultiTrigger.Conditions> <Setter TargetName="PART_Header" Property="MinWidth" Value="75"/> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="HasHeader" Value="false"/> <Condition Property="Height" Value="Auto"/> </MultiTrigger.Conditions> <Setter TargetName="PART_Header" Property="MinHeight" Value="19"/> </MultiTrigger> <Trigger Property="IsSelected" Value="true"> <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="true"/> <Condition Property="IsSelectionActive" Value="false"/> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> </MultiTrigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </TreeView.Resources>
<!--Описание шаблона всего компонента--> <TreeView.Template> <ControlTemplate> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <DockPanel> <GridViewHeaderRowPresenter Columns="{StaticResource gvcc}" DockPanel.Dock="Top"/> <ItemsPresenter/> </DockPanel> </Border> </ControlTemplate> </TreeView.Template> </TreeView>
|
Сделано криво, понимаю. Без привязки этот компонент работает - компилится, запускается, показывает заголовки таблицы. Как только привязываю (как привязывал раньше): Код | <Window.Resources> <HierarchicalDataTemplate ItemsSource="{Binding Children}" DataType="{x:Type lib:DiffItem}"/> </Window.Resources> <StackPanel x:Name="DiffPanel"> <DC:TreeListView x:Name="TLW" ItemsSource="{Binding Instance, Mode=OneWay}"></DC:TreeListView> </StackPanel>
|
, то вылетает с ошибкой: Свойство "Template" нельзя задать в Template текущего элемента. Прилагаю достаточный исходник.
Присоединённый файл ( Кол-во скачиваний: 2 )
TreeListViewMS.zip 326,62 Kb
|