Comment puis-je spécifier le TreeViewItem Style / Modèle pour un TreeViewItem généré à partir HierarchicalDataTemplate?

StackOverflow https://stackoverflow.com/questions/4726318

Question

Situation:

J'ai deux classes qui sont représentés dans un TreeView. DiskSpec et ensemble_disques. DiskSpec peut exister par lui-même, ou il peut être un enfant de ensemble_disques. Je travaille sur l'activation de la fonctionnalité glisser-déplacer de sorte que l'utilisateur peut faire glisser un DiskSpec à partir du nœud DiskSpec sur un ensemble de disques pour l'ajouter à cette ensemble_disques. Maintenant que tout fonctionne sauf pour une chose. Mes besoins de la classe DragDropHelper pour spécifier dans un ItemsPresenter (ou classe connexe) que ce contrôle est une source de déplacement ou une cible de dépôt.

Mon TreeView est configuré comme ceci:. TreeView

Le problème:

Alors je vraiment besoin d'avoir deux styles TreeViewItem. Une fois pour les ensembles de disques (qui précise que le ItemsPresenter qui présentera les DiskSpecs est un DropTarget) et l'autre pour tout le reste qui indique qu'il est ItemsPresenter est un DragSource.

Malheureusement, je ne l'ai pas vu un moyen de définir le style TreeViewItem ou modèle de l'objet HierarchicalDataTemplate, et il ne semble pas être un moyen de préciser que ce ItemTemplate est seulement pour un type de données particulier.

Toutes les pensées? Ou suis-je manque quelque chose?

Découvrez ci-dessous quelques exemples de mon XAML.

Par défaut TreeViewItem

Voir la section ItemsPresenter pour un exemple des paramètres de propriétés de DragDropHelper.

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="Padding" Value="1,0,0,0"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TreeViewItem}">
                <Grid Margin="0,4,0,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" MinWidth="10"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" MinHeight="27.75"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" BorderBrush="#00376206" Foreground="#00000000" Style="{DynamicResource ToggleButtonStyle1}" Grid.Column="1">
                        <ToggleButton.Background>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="White" Offset="0"/>
                                <GradientStop Color="#00F3EEDB" Offset="0.9"/>
                            </LinearGradientBrush>
                        </ToggleButton.Background>
                    </ToggleButton>
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Grid.Column="0" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true" Grid.ColumnSpan="2" CornerRadius="7" Height="26" VerticalAlignment="Top" Margin="0,0,8,0" Background="#59000000">
                        <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Margin="5,3,0,3" VerticalAlignment="Center"/>
                    </Border>
                    <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1" drag:DragDropHelper.IsDropTarget="False" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsExpanded" Value="false">
                        <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
                    </Trigger>
                    <Trigger Property="HasItems" Value="false">
                        <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="BitmapEffect" TargetName="Bd">
                            <Setter.Value>
                                <DropShadowBitmapEffect />
                            </Setter.Value>
                        </Setter>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        <Setter Property="Background" TargetName="Bd">
                            <Setter.Value>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="#FF5C5C5C" Offset="0.27"/>
                                    <GradientStop Color="#FF585858" Offset="1"/>
                                    <GradientStop Color="#FF747474" Offset="0"/>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" 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.Triggers>
        <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true">
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

TreeView la structure

<TreeView x:Name="treeView" Margin="4,40,4,4" Style="{DynamicResource SnazzyTreeView}" >
    <TreeView.Resources>

    </TreeView.Resources>
    <TreeViewItem ItemsSource="{Binding Disks}" IsExpanded="True" drag:DragDropHelper.IsDragSource="True" drag:DragDropHelper.IsDropTarget="False" drag:DragDropHelper.DragDropTemplate="{StaticResource draggedDisk}">
        <TreeViewItem.Header>
            <TextBlock Text="Disks" Foreground="White" FontSize="16"/>
        </TreeViewItem.Header>
    </TreeViewItem>
    <TreeViewItem ItemsSource="{Binding DiskSets}" IsExpanded="True">
        <TreeViewItem.Header>
            <TextBlock Text="DiskSets" Foreground="White" FontSize="16"/>
        </TreeViewItem.Header>
    </TreeViewItem>
</TreeView>

Bea Stolnitz Blog Post: Comment puis-je faire glisser et déposer des éléments entre les données liées ItemsControls?

Était-ce utile?

La solution

Pourquoi avez-vous besoin d'un style pour un TreeViewItem? Il peut être fait en utilisant uniquement DataTemplates et ne spécifiez pas de clé si vous voulez qu'ils appliquent automatiquement.

<Window.Resources>
    <DataTemplate DataType = "{x:Type local:DiskSpec}">
        <TextBlock Text="{Binding Title}" drag:DragDropHelper.IsDragSource="True"
                   drag:DragDropHelper.IsDropTarget="False"/>
    </DataTemplate>

    <HierarchicalDataTemplate DataType = "{x:Type local:DiskSet}"
                            ItemsSource = "{Binding Path=Disks}">
        <TextBlock Text="{Binding Title}"/>
    </HierarchicalDataTemplate>

</Window.Resources>

tree.ItemsSource = new object[]{
            new DiskSpec{Title = "Disc 1"},
            new DiskSpec{Title = "Disc 2"},
            new DiskSet{Title = "Set 1", Disks = new List<DiskSpec>{new DiskSpec{Title="Disc 1.1"}}},
            new DiskSet{Title = "Set 2", Disks = new List<DiskSpec>{new DiskSpec{Title="Disc 2.1"}, new DiskSpec{Title="Disc 2.2"}}}};

Après cela, vous pouvez activer le glisser dans le modèle de disque et déposez dans le modèle Set.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top