Why is it disabled?

XAF Team Blog
19 July 2007
    I've been often asked: "Why is the XXX action not visible?" or "Why is it disabled?"
 
    Well, sometimes it's difficult to find the cause, and it can even require a thorough debugging. An action can be invisible or disabled due to several reasons: security rights, ReadOnly views, a 'get' only access to a property, the absence of a default constructor, and lots of other specific parameters.

    To avoid these difficulties, we have introduced a possibility to name each reason. The Active/Enabled properties of the ActionBase class are calculated from a list of 'Boolean' values:
 
      activeResult = true;
      foreach(string key in ActiveList.GetKeys()) {
        activeResult = activeResult && ActiveList[key];
      }
 
    This approach allows a number of controllers to control the Active property independent from each other. For example, by default the “New” action is controlled by:
      - SecuritySystem: the action should be disabled if the current user doesn’t have appropriate rights
      - The View’s ReadOnly property: if the entire View is marked as ReadOnly then the action should be disabled
      - The possibility to create an object: it’s simply impossible to create an object if the class declaration doesn’t have a default constructor, and the action should be disabled
      - Collection settings: the collection can restrict adding new entries, and in this case, the “New” action should be disabled
 
    The “New” action will be disabled if there is at least one reason for it.
 
    The above reasons are controlled by different code placed in the XAF core and in a number of standard controllers. In addition to this code, you may introduce your own controller, which will restrict the “New” action’s availability in specific scenarios. This specific reason will be added into the list together with all other reasons.
 
    At the same time this approach allows you to investigate all the reasons and to easily find out why the action is invisible or disabled:
 
      string activeReasons;
      foreach(string key in ActiveList.GetKeys()) {
           activeReasons = activeReasons + key + " = " + ActiveList[key] + "\n";
      }
 
    The most common format to show this information is Xml. For example, the "NavigateBack" action detailed information can be like this:
 
      <Action ID="NavigateBack" TypeName="SingleChoiceAction" Category="ViewsHistoryNavigation" Active="True" Enabled="True" AdditionalInfo="">
           <ActiveList>
                <Item Key="EmptyItems" Value="True" />
                <Item Key="Controller active" Value="True" />
                <Item Key="HideActionsViewController" Value="True" />
                <Item Key="Main window" Value="True" />
           </ActiveList>
           <EnabledList>
                <Item Key="EmptyItems" Value="True" />
                <Item Key="Can back" Value="True" />
           </EnabledList>
      </Action>
 
     - The "EmptyItems" entry informs that there is a restriction on the items count in the action's ItemList, and currently there is one or several items. This action is a SingleChoiceAction, and it requires an item to be executed
     - The "Controller active" entry informs that there is a restriction on the controller's Active property, and currently the controller is active
     - The "HideActionsViewController" entry informs that this action can be disabled by the HideActionsViewController class, and that currently it is not disabled
     - The "Main window" entry informs that the action can only work in the application’s main window, and currently it is working in that window
 
    The "EnabledList" section contains similar entries.
 
    Another interesting information is the set of available ActionContainer objects on the Window and the way actions were distributed along the ActionContainers:
 
 <Template Name="ApplicationWindowContext" TypeName="DevExpress.ExpressApp.Win.Templates.MainForm">
      <ActionContainers>

           <Container Name="About" />
           <Container Name="Tools">
                <Actions>
                     <Action ID="EditModel" />
                     <Action ID="ChooseSkin" />
                     <Action ID="ChangePasswordByUser" />
                </Actions>
           </Container>
           <Container Name="File" />
           <Container Name="ObjectsCreation">
                <Actions>
                     <Action ID="New" />
                     <Action ID="AddFromFile" />
                     <Action ID="CloneObject" />
                </Actions>
           </Container>
 
      </ActionContainers>
 
    All this information is collected by the "DiagnosticInfoController" class, which only contains the "Diagnostic Info" action. By default, this action is disabled. To show, add a special entry into the "app.config" or "web.config" file:
 
      <appSettings>
          <add key="EnableDiagnosticActions" value="True" />
      </appSettings>

 
    This action shows a popup window with a large edit box that shows the information in the Xml format.
 
    This action helped me solve a number of issues with ease and save a lot of time on developing XAF applications. Hope, it will help you as well.

 
--
Thanks, Dan
R&D, .NET Team Developer Express Inc.
 
PS. If you wish to receive direct assistance from our Support Team, use
Support Center at http://www.devexpress.com/Support/Center

Free DevExpress Products - Get Your Copy Today

The following free DevExpress product offers remain available. Should you have any questions about the free offers below, please submit a ticket via the DevExpress Support Center at your convenience. We'll be happy to follow-up.
Tags
No Comments

Please login or register to post comments.