如何知道DropDownButton中点击了什么

本文关键字:什么 何知道 DropDownButton | 更新日期: 2023-09-27 17:58:07

在此页面中,DropDownButton使用ContextMenu来显示ItemsSource。我们如何知道用户点击了什么?按钮上的Click事件不适用于菜单,而是按钮本身。我没有看到其他事件。

如何知道DropDownButton中点击了什么

我在寻找相同答案时遇到了这个问题。我从来没有真正在网上找到任何东西,但我自己发现了这个解决方案。也许这对将来的某个人会有所帮助。

如前所述,DropDownButton使用ContextMenu来显示其ItemsSource。基本上,我想要的是一个按钮上的"菜单式"下拉菜单。例如,假设您有一个DropDownButton,上面写着"添加"。也许你想要两个选项,如"添加新的"answers"添加现有的"。所以这就是我所做的。。。

首先,我制作了一些对象来保存标题/内容和命令。

public class TitledCommand
{
    public String Title { get; set; }
    public ICommand Command { get; set; }
}

从理论上讲,您将有一个列表来绑定到DropDownButtonItemsSource

public List<TitledCommand> TitledCommmands { get; private set; }

现在我们只为DropDownButton设置项容器的样式,这样它就可以从ItemsSource中的对象中获取头和命令。

包括MahApps:

xmlns:metroControls="http://metro.mahapps.com/winfx/xaml/controls"

这是风格。。。

<metroControls:DropDownButton Content="Add" ItemsSource="{Binding Path=TitledCommmands}">
    <metroControls:DropDownButton.ItemContainerStyle>        
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding Path=Title}"/>
            <Setter Property="Command" Value="{Binding Path=Command}"/>
        </Style>          
    </metroControls:DropDownButton.ItemContainerStyle>
</metroControls:DropDownButton>

您可以覆盖控件的项模板,并可以在其中添加一个处理程序,如下所示:

<controls:DropDownButton Content="Select me" x:Name="selectMeDropDownButton">
    <controls:DropDownButton.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" MouseDown="selectMeDropDownButton_TextBlock_MouseDown" />
        </DataTemplate>
    </controls:DropDownButton.ItemTemplate>
</controls:DropDownButton>

并在代码隐藏文件中实现事件处理程序,如下所示:

void selectMeDropDownButton_TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left && this.selectMeDropDownButton.IsExpanded)
    {
        var value = ((TextBlock)e.Source).DataContext;
        // Do something meaningful with the value, it's an item from ItemsSource
    }
}

DropDownButton.IsExpanded的检查是必要的,因为相同的ItemTemplate应用于按钮本身上的Content。当然,您可以将TextBlock替换为任何您喜欢的Control/UIElement

为ContextMenu/DropDownButton创建一个attached property(根据您的喜好)。如果您进行了下拉,则获取它显示的上下文菜单,然后从中挂起Click事件,并将值推回到属性中。

使用SplitButton而不是DropDownButton。第一个具有SelectionChanged事件。