Wpf 如何在toolkit DropDownButton IsOpen上设置事件触发器

Wpf 如何在toolkit DropDownButton IsOpen上设置事件触发器,wpf,xaml,events,triggers,Wpf,Xaml,Events,Triggers,我有一个下拉按钮(来自扩展WPF工具包的组件),它有一个列表视图作为下拉内容。我想在用户选择一个项目后立即关闭弹出部分。我想我可以通过一个事件触发器来实现这一点,将ListView.SelectionChanged作为源事件,将DropDownButton.IsOpen作为目标属性,并将其设置为false 但是,当我选择一个项目时,会出现以下异常: 无法解析属性路径“IsOpen”中的所有属性引用。验证适用对象是否支持这些属性 这是我的XAML: <ListView.Triggers>

我有一个下拉按钮(来自扩展WPF工具包的组件),它有一个列表视图作为下拉内容。我想在用户选择一个项目后立即关闭弹出部分。我想我可以通过一个事件触发器来实现这一点,将ListView.SelectionChanged作为源事件,将DropDownButton.IsOpen作为目标属性,并将其设置为false

但是,当我选择一个项目时,会出现以下异常:

无法解析属性路径“IsOpen”中的所有属性引用。验证适用对象是否支持这些属性

这是我的XAML:

<ListView.Triggers>
<EventTrigger RoutedEvent="ListView.SelectionChanged" SourceName="MyListView">
    <EventTrigger.Actions>
        <BeginStoryboard>
            <Storyboard>
                <BooleanAnimationUsingKeyFrames
                Storyboard.Target="{Binding Source={RelativeSource Mode=FindAncestor,AncestorType=xctk:DropDownButton}}"
                Storyboard.TargetProperty="IsOpen"
                FillBehavior="HoldEnd">
                    <DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:1" />
                </BooleanAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger.Actions>
</EventTrigger>
</ListView.Triggers>


有人能告诉我我做错了什么吗?

对于那些感兴趣的人,这里有一个相对简单的解决方案,不涉及任何代码隐藏

<Window x:Class="PopupDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <Style x:Key="MyPopupMenu"  TargetType="MenuItem"  >
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="SnapsToDevicePixels" Value="True" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="MenuItem">
                        <Border x:Name="Border"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                            <Grid >
                                <ContentPresenter ContentSource="Header" />
                                <Rectangle x:Name="overlay"
                                               Fill="Black"
                                               IsHitTestVisible="False"
                                               Visibility="Hidden"
                                               Opacity="0.1" >
                                </Rectangle>

                                <Popup IsOpen="{Binding Path=IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" Placement="Bottom" x:Name="SubMenuPopup" Focusable="false" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}">
                                    <Border x:Name="SubMenuBorder" 
                                            Background="White"
                                            BorderBrush="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Menu}}}" 
                                            BorderThickness="1" Padding="2,2,2,2">
                                        <Grid x:Name="SubMenu" Grid.IsSharedSizeScope="True">
                                            <!-- StackPanel holds children of the menu. This is set by IsItemsHost=True -->
                                            <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
                                        </Grid>
                                    </Border>
                                </Popup>

                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver"  Value="True" >
                                <Setter TargetName="overlay" Property="Visibility" Value="Visible" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>


    <DockPanel LastChildFill="False">
        <Menu DockPanel.Dock="Top"  Background="Transparent">
            <MenuItem Style="{StaticResource MyPopupMenu}" >
                <MenuItem.Header>
                    <Border Background="#3382cc" BorderThickness="12 4" BorderBrush="#3382cc">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="My Popup Menu"  Foreground="White"  />
                        </StackPanel>
                    </Border>
                </MenuItem.Header>
                <MenuItem Header="Alfa"  />
                <MenuItem Header="Bravo"  />
                <MenuItem Header="Charlie"  />
                <MenuItem Header="Delta"  />
                <MenuItem Header="Echo"  />
            </MenuItem>
        </Menu>
    </DockPanel>
</Window>


我认为在动画(情节串连板或其他类型的动画,如使用关键帧的BooleanAnimation)中使用
RelativeSource
ElementName
无法绑定任何东西。您必须尝试某种代理或使用
{x:Reference}
(从.NET 4.0开始支持)来指定
情节提要.Target
,这意味着您的
下拉按钮应该指定一些
名称。@King-King:使用x:Reference确实消除了异常,虽然在弹出窗口消失之前有一个小的延迟。但是现在,再次单击下拉按钮重新打开弹出部分不再工作。我正在尝试做同样的事情,你有没有让它工作过?还是你在玩自己的控制游戏?@BitFiddler已经有一段时间了,但如果我没记错的话,我玩了自己的控制游戏。我已经在WPF论坛上发布了帖子,所以你可能想看看那里的讨论:@bitfidler查看我关于纯XAML解决方案的其他答案。