private static object CoerceLabelProperty(DependencyObject obj, object value) { if (value == null) { var control = obj as IGameControl; if ((control != null) && (control.Command != null)) { var commandUIProvider = GameCommandUIManager.GetUIProviderResolved(control.Command); if (commandUIProvider != null) { return(commandUIProvider.Label); } } } return(value); }
internal static void HookCommands(IGameControl control, ICommand oldCommand, ICommand newCommand) { var wasAttached = control.Flags.GetFlag(GameControlFlags.IsAttachedToCommandCanExecuteChanged); if ((wasAttached) && (oldCommand != null)) { control.Flags.SetFlag(GameControlFlags.IsAttachedToCommandCanExecuteChanged, false); if (control.CommandCanExecuteHandler != null) { oldCommand.CanExecuteChanged -= control.CommandCanExecuteHandler; control.CommandCanExecuteHandler = null; } } if (!control.Flags.GetFlag(GameControlFlags.IsAttachedToCommandCanExecuteChanged) && (newCommand != null) && (control.CanUpdateCanExecuteWhenHidden || control.IsVisible)) { control.Flags.SetFlag(GameControlFlags.IsAttachedToCommandCanExecuteChanged, true); control.CommandCanExecuteHandler = new EventHandler(control.OnCanExecuteChanged); newCommand.CanExecuteChanged += control.CommandCanExecuteHandler; } // If no change was made, don't bother updating the CanExecute since this was called by an IsVisible change if (((oldCommand != newCommand) || !wasAttached || !control.Flags.GetFlag(GameControlFlags.IsAttachedToCommandCanExecuteChanged))) { control.UpdateCanExecute(); } wasAttached = control.Flags.GetFlag(GameControlFlags.IsAttachedToCommandUIProvider); if ((wasAttached) && (oldCommand != null)) { var commandUIProvider = GameCommandUIManager.GetUIProviderResolved(oldCommand); if (commandUIProvider != null) { control.Flags.SetFlag(GameControlFlags.IsAttachedToCommandUIProvider, false); CommandUIProviderPropertyChangedRouter router; if (_uiProviderPropertyChangedRouter.TryGetValue(commandUIProvider, out router)) { router.Remove(control); if (!router.HasLiveReferences) { commandUIProvider.PropertyChanged -= router.OnCommandUIProviderPropertyChanged; _uiProviderPropertyChangedRouter.Remove(commandUIProvider); } } } } if ((!control.Flags.GetFlag(GameControlFlags.IsAttachedToCommandUIProvider)) && (newCommand != null) && ((control.CanUpdateCanExecuteWhenHidden) || (control.IsVisible))) { var commandUIProvider = GameCommandUIManager.GetUIProviderResolved(newCommand); if (commandUIProvider != null) { control.Flags.SetFlag(GameControlFlags.IsAttachedToCommandUIProvider, true); CommandUIProviderPropertyChangedRouter router; if (!_uiProviderPropertyChangedRouter.TryGetValue(commandUIProvider, out router)) { router = new CommandUIProviderPropertyChangedRouter(); commandUIProvider.PropertyChanged += router.OnCommandUIProviderPropertyChanged; _uiProviderPropertyChangedRouter.Add(commandUIProvider, router); } router.Add(control); } } // Update the UI based on the command UpdateUIFromCommand(control); }