16using System.Windows.Controls;
17using System.Windows.Controls.Primitives;
18using System.Windows.Input;
32 #region Command Context
192 => $
"Event={EventName}, SelectedItem={SelectedItem ?? "(
null)
"}, SelectedIndex={SelectedIndex}";
197 #region Attached Flags (Private)
208 DependencyProperty.RegisterAttached(
212 new PropertyMetadata(
false));
223 DependencyProperty.RegisterAttached(
224 "IsDropDownClosedHooked",
227 new PropertyMetadata(
false));
238 DependencyProperty.RegisterAttached(
242 new PropertyMetadata(
false));
253 DependencyProperty.RegisterAttached(
254 "DropDownClosedHandler",
255 typeof(EventHandler),
257 new PropertyMetadata(
null));
268 DependencyProperty.RegisterAttached(
270 typeof(RoutedEventHandler),
272 new PropertyMetadata(
null));
611 #region Attached DPs (Public)
622 DependencyProperty.RegisterAttached(
637 DependencyProperty.RegisterAttached(
641 new PropertyMetadata(
null));
652 DependencyProperty.RegisterAttached(
653 "CommandTriggerName",
656 new PropertyMetadata(
null));
911 private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
913 if (d is not UIElement element)
920 element.AddHandler(UIElement.PreviewMouseUpEvent,
new MouseButtonEventHandler((s, ev) =>
925 element.AddHandler(Control.MouseDoubleClickEvent,
new MouseButtonEventHandler((s, ev) =>
931 element.AddHandler(UIElement.PreviewKeyDownEvent,
new KeyEventHandler((s, ev) =>
936 element.AddHandler(UIElement.PreviewKeyUpEvent,
new KeyEventHandler((s, ev) =>
942 element.AddHandler(UIElement.TouchUpEvent,
new EventHandler<TouchEventArgs>((s, ev) =>
944 TryExecuteCommand(d, s,
"TouchUp", ev);
948 element.AddHandler(ButtonBase.ClickEvent,
new RoutedEventHandler((s, ev) =>
954 element.AddHandler(Selector.SelectionChangedEvent,
new SelectionChangedEventHandler((s, ev) =>
965 RoutedEventHandler unloadedHandler = (_, __) =>
968 if (d is ComboBox combo)
973 combo.DropDownClosed -= h;
981 fe.Unloaded += unloadedHandler;
989 EventHandler handler = (s, ev) =>
994 comboBox.DropDownClosed += handler;
1002 #region Execute Logic
1060 private static void TryExecuteCommand(DependencyObject d,
object? sender,
string eventName, RoutedEventArgs eventArgs)
1063 if (eventName.Equals(
"PreviewKeyDown", StringComparison.OrdinalIgnoreCase) &&
1064 eventArgs is KeyEventArgs ke && ke.IsRepeat)
1070 if (
string.IsNullOrWhiteSpace(rawTrigger))
1073 var triggerList = rawTrigger.Split(
',')
1074 .Select(x => x.Trim())
1075 .Where(x => !
string.IsNullOrWhiteSpace(x));
1077 if (!triggerList.Contains(eventName, StringComparer.OrdinalIgnoreCase))
1081 if (command ==
null)
1085 var combo = (sender as ComboBox) ?? (d as ComboBox);
1089 if (command.CanExecute(parameter))
1090 command.Execute(parameter);
1149 private static void TryExecuteCommand(DependencyObject d,
object? sender,
string eventName, EventArgs eventArgs)
1152 if (
string.IsNullOrWhiteSpace(rawTrigger))
1155 var triggerList = rawTrigger.Split(
',')
1156 .Select(x => x.Trim())
1157 .Where(x => !
string.IsNullOrWhiteSpace(x));
1159 if (!triggerList.Contains(eventName, StringComparer.OrdinalIgnoreCase))
1163 if (command ==
null)
1167 var combo = (sender as ComboBox) ?? (d as ComboBox);
1171 if (command.CanExecute(parameter))
1172 command.Execute(parameter);
static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
static readonly DependencyProperty CommandProperty
static ? EventHandler GetDropDownClosedHandler(DependencyObject o)
static object GetCommandParameter(DependencyObject obj)
static bool GetIsHandlersHooked(DependencyObject o)
static void SetUnloadedHandler(DependencyObject o, RoutedEventHandler? h)
static readonly DependencyProperty IsHandlersHookedProperty
static void SetIsDropDownClosedHooked(DependencyObject o, bool v)
static ? RoutedEventHandler GetUnloadedHandler(DependencyObject o)
static readonly DependencyProperty UnloadedHandlerProperty
static void SetIsHandlersHooked(DependencyObject o, bool v)
static void SetDropDownClosedHandler(DependencyObject o, EventHandler? h)
static bool GetIsDropDownClosedHooked(DependencyObject o)
static readonly DependencyProperty CommandParameterProperty
static readonly DependencyProperty IsDropDownClosedHookedProperty
static void SetCommandParameter(DependencyObject obj, object value)
static void SetCommand(DependencyObject obj, ICommand value)
static void SetCommandTriggerName(DependencyObject obj, string value)
static readonly DependencyProperty IsUnloadedHookedProperty
static readonly DependencyProperty DropDownClosedHandlerProperty
static readonly DependencyProperty CommandTriggerNameProperty
static void TryExecuteCommand(DependencyObject d, object? sender, string eventName, RoutedEventArgs eventArgs)
static ICommand GetCommand(DependencyObject obj)
static void TryExecuteCommand(DependencyObject d, object? sender, string eventName, EventArgs eventArgs)
static bool GetIsUnloadedHooked(DependencyObject o)
static string GetCommandTriggerName(DependencyObject obj)
static void SetIsUnloadedHooked(DependencyObject o, bool v)
override string ToString()
DreamineComboBoxCommandContext(string eventName, object? sender, object? args, ComboBox? combo)