WPF事件触发器有时不会触发

3
我有一个外观自定义的WPF TreeView,看起来像这样:

treeview

我定义了一个EventTrigger来响应点击事件:
<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>

问题在于点击根元素“Ausführungsvorschrift”只会展开树形结构,但事件不会触发。当点击子元素时,它会触发事件,当在边框内点击时也会触发事件。但是标题却不会触发任何事件。

是的,它可以做到。你需要绑定到扩展事件或者实现一个类似按钮的行为,该行为有一个动作(显然在第二种情况下,你需要编程告诉扩展器,在按钮点击时进行扩展)。 - Bizhan
你尝试过previewmousedown吗? - Andy
@mm8:是的,我试过了。不起作用。 - juergen d
1个回答

6

尝试为模板中的 Expander 元素添加ExpandedCollapsed事件的触发器:

<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>

是的,那个可以工作。问题是我在ViewModel中无法知道点击了什么,因为我得到了NULLSelectedItem。你知道怎么解决吗? :-) - juergen d
不错,但我用它得到了最后一个SelectedItem。似乎是在此事件触发后设置了SelectedItem。 - juergen d
那你想要根节点是吗? - mm8
但是当您单击“展开器”节点时,您想将此节点作为CommandParameter传递,对吗? - mm8
你期望的是哪种类型? - mm8
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接