如何知道在DropDownButton中点击了什么

时间:2014-04-11 17:46:05

标签: c# wpf mahapps.metro

Per this page,DropDownButton使用ContextMenu显示ItemsSource。我们如何知道用户点击的内容?按钮上的Click事件不是菜单,而是按钮本身。我看不到其他任何事件。

3 个答案:

答案 0 :(得分:14)

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

如前所述,DropDownButton使用ContextMenu来显示其ItemsSource。基本上我正在寻找的是一个来自按钮的“菜单式”下拉菜单。例如,假设您有DropDownButton表示“添加”。也许你想要2个选项,如“添加新”和“添加现有”。所以这就是我做的......

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

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

从理论上讲,您可以将这些列表绑定到ItemsSource的{​​{1}}。

DropDownButton

现在我们只为public List<TitledCommand> TitledCommmands { get; private set; } 设置项容器的样式,以便它从DropDownButton中的对象中选取标题和命令。

包括MahApps:

ItemsSource

这是风格......

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

答案 1 :(得分:3)

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

<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

答案 2 :(得分:0)

为ContextMenu / DropDownButton创建一个attached property(无论您喜欢哪个)。如果您执行了下拉菜单,则获取它正在显示的上下文菜单,然后将Click事件与其挂钩并将值推回属性。