juergen d
juergen d

Reputation: 204766

WPF EventTrigger not always firing

I have a WPF TreeView that I customized visually looking like this:

treeview

I defined an EventTrigger to react on clicks:

<TreeView>            
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonUp">
            <i:InvokeCommandAction Command="{Binding OpenPartListCommand}" CommandParameter="{Binding ElementName=PartsTreeView, Path=SelectedItem}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="TreeViewItem" >
                            <Grid Margin="6,4">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <Border Name="Bd" 
                                        Background="{Binding Background}"
                                        BorderBrush="Black" 
                                        BorderThickness="1.2" 
                                        CornerRadius="0"
                                        MinHeight="35"
                                        Padding="5"     
                                        SnapsToDevicePixels="True"
                                        Margin="{Binding Path=Margin}" >
                                    <Grid>                                            
                                        <Expander Name="Exp" IsExpanded="{TemplateBinding TreeViewItem.IsExpanded}">
                                            <Expander.Header>                                                   
                                                <ContentPresenter ContentSource="Header"                                                                       
                                                                  Width="{Binding Path=ActualWidth, ElementName=PartsTreeView, Mode=OneWay, Converter={StaticResource MathConverter}, ConverterParameter=@VALUE-80}"  />

                                            </Expander.Header>                                                
                                            <ItemsPresenter />
                                        </Expander>

                                        <ContentPresenter Name="CntPres"
                                                    ContentSource="Header"
                                                    HorizontalAlignment="Center"
                                                    VerticalAlignment="Center"
                                                    Visibility="Collapsed"                                                         
                                                    Width="{Binding Path=ActualWidth, ElementName=PartsTreeView, Mode=OneWay, Converter={StaticResource MathConverter}, ConverterParameter=@VALUE-80}"  
                                                    />              
                                    </Grid>
                                </Border>
                            </Grid>

                            <ControlTemplate.Triggers>

                                <Trigger Property="TreeViewItem.HasItems" Value="false">
                                    <Setter 
                                          TargetName="Exp" 
                                          Property="Visibility" 
                                          Value="Collapsed" />
                                    <Setter 
                                          TargetName="CntPres" 
                                          Property="Visibility" 
                                          Value="Visible" />            
                                </Trigger>


                                <Trigger Property="TreeViewItem.Name" Value="IsSpecial">
                                    <Setter Property="Background" TargetName="Bd" Value="#FFC3AF"/>
                                </Trigger>
                                <Trigger Property="TreeViewItem.Name" Value="IsNotSpecial">
                                    <Setter Property="Background" TargetName="Bd" Value="#8BADC5"/>
                                </Trigger>


                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter Property="Background" TargetName="Bd" Value="#FFF0EA"/>
                                </Trigger>
                                <Trigger Property="IsFocused" Value="True">
                                    <Setter Property="Background" TargetName="Bd" Value="#FFF0EA"/>
                                </Trigger>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter TargetName="Bd" Property="Background" Value="#FFF0EA"/>
                                </Trigger>

                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

                <Setter Property="ItemsPanel">
                    <Setter.Value>
                        <ItemsPanelTemplate>
                            <ItemsPanelTemplate.Resources>                                    
                            </ItemsPanelTemplate.Resources>
                            <StackPanel  IsItemsHost="True"   />
                        </ItemsPanelTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    </TreeView.Resources>
</TreeView>

The problem is that clicking on the root element "Ausführungsvorschrift" only expands the tree but the event is not fired. It fires when clicking on sub elements though and it fires when clicking inside the border. But the header does not fire anything.

Upvotes: 3

Views: 819

Answers (1)

mm8
mm8

Reputation: 169210

Try to add triggers for the Expanded and Collapsed events to the Expander element in the template:

<Expander Name="Exp" IsExpanded="{TemplateBinding TreeViewItem.IsExpanded}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Expanded">
            <i:InvokeCommandAction Command="{Binding DataContext.OpenPartListCommand, RelativeSource={RelativeSource AncestorType=TreeView}}" 
                                   CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}}" />
        </i:EventTrigger>
        <i:EventTrigger EventName="Collapsed">
            <i:InvokeCommandAction Command="{Binding DataContext.OpenPartListCommand, RelativeSource={RelativeSource AncestorType=TreeView}}" 
                                   CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Expander.Header>
        <ContentPresenter ContentSource="Header" />
    </Expander.Header>
    <ItemsPresenter />
</Expander>

Upvotes: 6

Related Questions