Laden...

WPF: TreeView Problem, HierarchicalDataTemplate

Erstellt von mstoll vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.577 Views
M
mstoll Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren
WPF: TreeView Problem, HierarchicalDataTemplate

Hallo Forum,

ich habe ein Problem mit dem WPF-TreeView und hierarchischen DataTemplates.
Der TreeView soll an mein ViewModel gebunden werden.

Folgender XAML-Code:


 	
        <HierarchicalDataTemplate x:Key="hContractRule">
            <TreeViewItem Header="{Binding ContractRuleName}" IsExpanded="True" />
        </HierarchicalDataTemplate>

        
        <HierarchicalDataTemplate x:Key="hContractContent" >
            <TreeViewItem Header="{Binding ContractContentName}"   IsExpanded="True" ToolTip="{Binding Description}">
                <TreeViewItem Header="Regeln" ItemTemplate="{StaticResource hContractRule}" ItemsSource="{Binding ContractRules}">
                    <TreeViewItem.ContextMenu>
                        <ContextMenu>
                            <MenuItem Command="{Binding Source={StaticResource vmMain}, Path=AddContractContentRule}" Header="Regel hinzufügen"/>
                        </ContextMenu>
                    </TreeViewItem.ContextMenu>
                </TreeViewItem>
                <TreeViewItem.ContextMenu>
                    <ContextMenu>
                        <MenuItem Command="{Binding Source={StaticResource vmMain}, Path=DeleteContractContent}" Header="Vertragsinhalt löschen"/>
                    </ContextMenu>
                </TreeViewItem.ContextMenu>
            </TreeViewItem>
        </HierarchicalDataTemplate>

     
        <HierarchicalDataTemplate  x:Key="hContract">
            <TreeViewItem Header="{Binding ContractName}">
                <TreeViewItem Header="Vertragsinhalte"  ItemTemplate="{StaticResource hContractContent}" ItemsSource="{Binding ContractContents}">
                    <TreeViewItem.ContextMenu>
                        <ContextMenu>
                            <MenuItem Command="{Binding Source={StaticResource vmMain}, Path=AddContractContent}" Header="Vertragsinhalt hinzufügen"/>
                        </ContextMenu>
                    </TreeViewItem.ContextMenu>
                </TreeViewItem>
            </TreeViewItem>
        </HierarchicalDataTemplate>


Der TreeView wird wie folgt verwendet:


        <!--ContractView-->
        <TreeView x:Name="tvContractView"
                  OverridesDefaultStyle="False"
                    BorderThickness="0.5" 
                    Margin="20,10,10,10" 
                    VerticalAlignment="Top" 
                    BorderBrush="{x:Null}" Background="{x:Null}"
                    Grid.Row="2" 
                    ItemsSource="{Binding SearchedContracts}"
                    ItemTemplate="{StaticResource hContract}"
                    >

            <ts:CommandSource.Trigger>
                <ts:CommandTriggerGroup>
                    <ts:EventCommandTrigger
                        RoutedEvent="TreeView.SelectedItemChanged"
                        Command="{Binding ContractSelectedItemChanged}" 
                        CustomParameter="{Binding ElementName=tvContractView, Path=SelectedItem}"/>
                </ts:CommandTriggerGroup>
            </ts:CommandSource.Trigger>

        </TreeView>

Wird der Tree jetzt gefüllt wird er schonmal richtig dargestellt.
Das Problem liegt darin, dass ich die einzelnen Nodes nicht markieren kann.

BILD1

Hinzu kommt noch, dass sich die Nodes nichtmal aufklappen lassen wenn der Style, den wir für TreeViewItems angelegt haben, aktiv ist:

BILD2

Der Style beschreibt lediglich aussehen:


<Style d:IsControlPart="True" TargetType="{x:Type TreeViewItem}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="{DynamicResource WhiteColor}"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="Padding" Value="1,0,0,0"/>
        <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <ControlTemplate.Resources>
                        <Storyboard x:Key="SelectedOn">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SelectedBorder" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="SelectedOff">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SelectedBorder" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="HoverOn">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="HoverBorder2" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="HoverBorder1" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0.5"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="HoverOff">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="HoverBorder2" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
                            </DoubleAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="HoverBorder1" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="SelectedHoverOn">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SelectedHoverBorder" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="SelectedHoverOff">
                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SelectedHoverBorder" Storyboard.TargetProperty="(UIElement.Opacity)">
                                <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                    </ControlTemplate.Resources>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition MinWidth="19" Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <ToggleButton x:Name="Expander" Style="{DynamicResource NuclearTreeViewItemToggleButton}" IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                        <Border Grid.Column="1" x:Name="Selection_Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                            <Grid>
                                <Border Background="{DynamicResource NormalBrush}" BorderBrush="{DynamicResource NormalBorderBrush}" BorderThickness="2,2,2,2" CornerRadius="2,2,2,2" Opacity="0" x:Name="SelectedBorder"/>
                                <Border x:Name="HoverBorder1" Opacity="0" Background="{DynamicResource NormalBrush}" BorderBrush="{DynamicResource NormalBorderBrush}" BorderThickness="1,1,1,1" CornerRadius="2,2,2,2"/>
                                <Border x:Name="HoverBorder2" Opacity="0" Background="{DynamicResource HoverBrush}" BorderBrush="{x:Null}" BorderThickness="1,1,1,1" CornerRadius="2,2,2,2"/>
                                <ContentPresenter HorizontalAlignment="Stretch" TextElement.Foreground="White"  x:Name="PART_HeaderWhite" ContentSource="Header" d:LayoutOverrides="Width" Margin="3,2,3,2" Visibility="Collapsed"/>
                                <ContentPresenter HorizontalAlignment="Stretch" x:Name="PART_HeaderBlack" ContentSource="Header" Margin="3,2,3,2" d:LayoutOverrides="Width"/>
                                <Border x:Name="SelectedHoverBorder" Opacity="0" Background="{DynamicResource HoverBrush}" BorderBrush="{x:Null}" BorderThickness="1,1,1,1" CornerRadius="2,2,2,2"/>
                            </Grid>
                        </Border>
                        <ItemsPresenter Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1" x:Name="ItemsHost"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource SelectedHoverOff}" x:Name="SelectedHoverOff_BeginStoryboard"/>
                            </MultiTrigger.ExitActions>
                            <MultiTrigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource SelectedHoverOn}" x:Name="SelectedHoverOn_BeginStoryboard"/>
                            </MultiTrigger.EnterActions>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="True"/>
                                <Condition Property="IsMouseOver" Value="True"/>
                            </MultiTrigger.Conditions>
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="False"/>
                                <Condition Property="IsMouseOver" SourceName="Selection_Border" Value="True"/>
                            </MultiTrigger.Conditions>
                            <MultiTrigger.ExitActions>
                                <BeginStoryboard x:Name="HoverOff_BeginStoryboard" Storyboard="{StaticResource HoverOff}"/>
                            </MultiTrigger.ExitActions>
                            <MultiTrigger.EnterActions>
                                <BeginStoryboard x:Name="HoverOn_BeginStoryboard" Storyboard="{StaticResource HoverOn}"/>
                            </MultiTrigger.EnterActions>
                        </MultiTrigger>
                        <Trigger Property="IsExpanded" Value="false">
                            <Setter Property="Visibility" Value="Collapsed" TargetName="ItemsHost"/>
                        </Trigger>
                        <Trigger Property="HasItems" Value="false">
                            <Setter Property="Visibility" Value="Hidden" TargetName="Expander"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Trigger.ExitActions>
                                <BeginStoryboard x:Name="SelectedOff_BeginStoryboard" Storyboard="{StaticResource SelectedOff}"/>
                            </Trigger.ExitActions>
                            <Trigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource SelectedOn}"/>
                            </Trigger.EnterActions>
                            <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 Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" TargetName="Selection_Border"/>
                            <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>

Das der Style der zu bestimmten Typen hinterlegt ist Probleme macht und Dinge "überschreibt" ist mir jetzt schon mehrmals aufgefallen (auch Kontextmenüs, ...)

Könntet Ihr mir erklären an was das liegt, bzw. warum das so passiert?
Und welchen Ansatz sollte ich zur Lösung des Problems ausprobieren?

1. Warum funktioniert der TreeView mit meinen hDataTemplates nicht
2. Warum funktioniert er mit dem Style noch viel weniger
3. Habt ihr eine Erklärung für mein allgemeines Style Problem

Beste Grüße,
Max

ps.: kann ich nicht mehr als 1 Bild hinzufügen?