2009-12-16 5 views
1

Dans mon outil DSL personnalisé, je souhaite qu'un noeud de l'Explorateur ne puisse pas être supprimé. À part ça, je veux que ce soit comme un nœud régulier. Au fond ce que je veux est un noeud comme le Xml sérialisation Comportement dans l'explorateur DSL:Noeud permanent dans l'explorateur DSL

Xml Serialization Behavior context menu illustration http://img31.imageshack.us/img31/740/xmlserializerbehavior.png

Grâce à l'aide du réflecteur sur la classe XmlSerializationDefinitionSerializer dans l'assemblée Microsoft.VisualStudio.Modeling.Sdk.DslDefinition.dll I J'ai découvert que c'est juste un dérivé de DomainClass, donc il n'y a rien (évidemment) de spécial à ce sujet.

J'ai défini une DomainClass qui fonctionne comme le nœud, et un clic droit, il me permet d'ajouter des sous-noeuds juste la façon dont je veux travailler, je ne peux pas se débarrasser de ce menu Supprimer choix:

Delete context menu item illustration http://img705.imageshack.us/img705/9033/validators.png

J'ai essayé tout ce que je peux penser ... Je me suis fixé le poseur de propriété au privé, il se déplace, je l'ai mis à la multiplicité 1..1, qui n'a pas autre effet que de donner des erreurs quand le noeud "Validators" est manquant ... J'ai regardé toutes les propriétés à la fois pour la DomainClass et pour la DomainRelationship entre le modèle racine et la Validator Domain Class et aucun d'entre eux ne semble traiter . J'ai également regardé tout dans le nœud Explorer Behavior dans la fenêtre DSL Explorer. Je suis complètement perplexe. Est-ce que quelqu'un sait comment faire cela?

Répondre

1

D'accord, après un peu de recherche approfondie, j'ai trouvé comment faire cela. Voici ce que j'ai fait, au cas où quelqu'un d'autre aurait besoin de la réponse à ma question à l'avenir. Vous devez créer une classe partielle pour la DesignerExplorer de votre modèle DSL (Il est dans le projet DslPackage, créé par le fichier ModelExplorer.tt) et mettre le code suivant dans le:

internal partial class MyDesignerExplorer 
{ 
    /// <summary> 
    /// Override to stop the "Delete" command appearing for 
    /// Validators. 
    /// </summary> 
    protected override void ProcessOnStatusDeleteCommand(MenuCommand command) 
    { 
     // Check the selected items to see if they contain 
     // Validators. 
     if(this.SelectedElement.GetType()== typeof(Validators)) 
     { 
      // Disable the menu command 
      command.Enabled = false; 
      command.Visible = false; 
     } 
     else 
     { 
      // Otherwise, delegate to the base method. 
      base.ProcessOnStatusDeleteCommand(command); 
     } 
    } 
} 
+0

+1. Bien fait. J'adore les outils DSL et c'est bien que vous ayez répondu à la question. –