Could you tell me why you don't (often) use ApplicationCommandManager?

Hi! Thanks for your reply. I feel much appreciated.

Yes, I also found Button::setClickingTogglesState and Button::setCommandToTrigger .
I’m now on new project and I’m now using these method. I think it will be the solution, though I can’t say it’s perfectly working till I finish it.
So my “2” problem has been (almost) solved. Thank you @jrlanglois!
Then, I now have another question. Is there any examples which show me how to use ApplicationCommandManager for the parameters which should be handled by Sliders or ComboBoxes?
In my project currently, like that…

//===============Slider====================
//a member attribute whose class is almost singleton and statically callable,
//like MyApp   : JUCEApplication
//and has function static MyApp& getApp();
Array<Component*> commandFocusableWidgets;
Array<int>       commandFocusableWidgetsKey;

//public Member Function
void setWidgetFocus(int command)
{
   int index = -1;
   for (const auto& k : commandFocusableWidgetsKey)
   {
       if (k == command)
       {
           index = commandFocusableWidgetsKey.indexOf(k);
           break;
       }
   }

   //You forgot to add a focusable widget!
   jassert(index != -1);
   commandFocusableWidgets[index]->grabKeyboardFocus();
}

void addCommandFocusable(int command, Component* target)
{
   if (!commandFocusableWidgets.contains(target))
   {
       commandFocusableWidgets.insert(command, target);
       commandFocusableWidgetsKey.insert(command, command);
   }
}
//===============ComboBox=================
//let's think a ComboBox which changes bit depth.
//a member function in some class which is inherited by ApplicationCommandTarget.
void setNextBitDepth()
{
    auto& dep = app.engine->AudioBitDepth;
    dep = dep == 24
        ? 16
        : 24;
}
//=============implementation===============
bool perform(const InvocationInfo& info)override
{
   switch (info.commandID)
    {
    case MyEnum::SliderCommand:
        if(!MyApp::getApp().isHeadless())
           MyApp::getApp().setWidgetFocus(MyEnum::SliderCommand);
        return true;
    case MyEnum::ComboBoxCommand:
        setNextBitDepth();
        return true;
     //...
}

And, I would like to ask JUCErs “1” question again. Taking this discussion, and if there’s no performance difference between numeric type and juce::Identifier, I would suggest using CommandID = Identifier;. Taking backward compability, how about making a macro to switch using CommandID?
It’s just what came up my mind. Any comment, thoughts or telling me my misunderstands would much be appreciated, because it will be much help for my learning programming!
Thanks.

P.S.

I don’t think the JUCE website provides a tutorial on setting up and using command managers, so that could be a worthwhile request!

OK! But I don’t know how to request a tutorial. Where should I request? And What is the best way to make it progress?