using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; namespace ServerManagerTool.Common.Controls { public class DropDownButton : ToggleButton { public DropDownButton() { // Bind the ToogleButton.IsChecked property to the drop-down's IsOpen property Binding binding = new Binding("Menu.IsOpen") { Source = this }; this.SetBinding(IsCheckedProperty, binding); DataContextChanged += (sender, args) => { if (Menu != null) { Menu.DataContext = DataContext; } }; } public static readonly DependencyProperty MenuProperty = DependencyProperty.Register("Menu", typeof(ContextMenu), typeof(DropDownButton), new UIPropertyMetadata(null, OnMenuChanged)); public ContextMenu Menu { get { return (ContextMenu)GetValue(MenuProperty); } set { SetValue(MenuProperty, value); } } private static void OnMenuChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var dropDownButton = (DropDownButton)d; var contextMenu = (ContextMenu)e.NewValue; contextMenu.DataContext = dropDownButton.DataContext; } protected override void OnClick() { if (Menu != null) { // If there is a drop-down assigned to this button, then position and display it Menu.PlacementTarget = this; Menu.Placement = PlacementMode.Bottom; Menu.IsOpen = true; } } } }