Per this page,DropDownButton使用ContextMenu显示ItemsSource。我们如何知道用户点击的内容?按钮上的Click事件不是菜单,而是按钮本身。我看不到其他任何事件。
答案 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
事件与其挂钩并将值推回属性。