Beispiel #1
0
 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);
 }
Beispiel #2
0
        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);
        }