Création d'un langage spécifique à un domaine basé sur Windows FormsCreating a Windows Forms-Based Domain-Specific Language

Vous pouvez utiliser Windows Forms pour afficher l’état d’un modèle de langage de spécifique à un domaine (DSL), au lieu d’utiliser un diagramme DSL.You can use Windows Forms to display the state of a domain-specific language (DSL) model, instead of using a DSL diagram. Cette rubrique vous guide dans la liaison d’un Windows Form à DSL, à l’aide de la Visual StudioVisual Studio Visualization and Modeling SDK.This topic walks you through binding a Windows Form to a DSL, using the Visual StudioVisual Studio Visualization and Modeling SDK.

DSL-Wpf-2 instance A DSL, affichant une interface utilisateur du formulaire Windows et l’Explorateur de modèles.DSL-Wpf-2 A DSL instance, showing a Windows Form UI and the model explorer.

Création d’un Windows Forms DSLCreating a Windows Forms DSL

Le minimale WinForm concepteur les modèle DSL crée une DSL minimale que vous pouvez modifier pour l’adapter à vos propres exigences.The Minimal WinForm Designer DSL template creates a minimal DSL that you can modify to suit your own requirements.

Pour créer un DSL WinForms minimaleTo create a minimal WinForms DSL

  1. Créer une DSL à partir de la minimale WinForm concepteur modèle.Create a DSL from the Minimal WinForm Designer template.

    Dans cette procédure pas à pas, les noms suivants sont supposés :In this walkthrough, the following names are assumed:

    Nom de solution et DSLSolution and DSL name FarmAppFarmApp
    Espace de nomsNamespace Company.FarmAppCompany.FarmApp
  2. Faire des essais avec l’exemple initial fournies par le modèle :Experiment with the initial example that the template provides:

    1. Transformer tous les modèles.Transform All Templates.

    2. Générer et exécuter l’exemple (CTRL + F5).Build and run the sample (CTRL+F5).

    3. Dans l’instance expérimentale de Visual Studio, ouvrez le Sample fichier dans le projet de débogage.In the experimental instance of Visual Studio, open the Sample file in the debugging project.

      Notez qu’il s’affiche dans un contrôle Windows Forms.Notice that it is displayed in a Windows Forms control.

      Vous pouvez également voir les éléments du modèle affiché dans l’Explorateur.You can also see the elements of the model displayed in the Explorer.

      Ajouter des éléments dans le formulaire ou de l’Explorateur et notez qu’elles apparaissent dans l’affichage des autres.Add some elements either in the form or the Explorer, and notice that they appear in the other display.

    Dans l’instance principale de Visual StudioVisual Studio, notez les points suivants concernant la solution DSL :In the main instance of Visual StudioVisual Studio, notice the following points about the DSL solution:

  • DslDefinition.dsl ne contient aucun élément de diagramme.DslDefinition.dsl contains no diagram elements. Il s’agit, car vous n’utiliserez pas les diagrammes DSL pour afficher les modèles d’instance de cette DSL.This is because you will not use DSL diagrams to view instance models of this DSL. Au lieu de cela, vous allez lier un Windows Form au modèle et les éléments sur le formulaire affiche le modèle.Instead, you will bind a Windows Form to the model, and the elements on the form will display the model.

  • Outre la Dsl et DslPackage projets, la solution contient un troisième projet nommé UI. UI projet contient la définition d’un contrôle Windows Forms.In addition to the Dsl and DslPackage projects, the solution contains a third project named UI.UI project contains the definition of a Windows Forms control. DslPackage dépend de UI, et UI dépend Dsl.DslPackage depends on UI, and UI depends on Dsl.

  • Dans le DslPackage projet, UI\DocView.cs contient le code qui affiche le contrôle Windows Forms qui est défini dans le UI projet.In the DslPackage project, UI\DocView.cs contains the code that displays the Windows Forms control that is defined in the UI project.

  • Le UI projet contient un exemple fonctionnel d’un contrôle de formulaire lié à la DSL.The UI project contains a working sample of a form control bound to the DSL. Toutefois, il ne fonctionne pas lorsque vous avez modifié la définition DSL.However, it will not work when you have changed the DSL Definition. Le UI projet contient :The UI project contains:

    • Une classe Windows Forms nommée ModelViewControl.A Windows Forms class named ModelViewControl.

    • Un fichier nommé DataBinding.cs qui contient une définition partielle supplémentaire de ModelViewControl.A file named DataBinding.cs that contains an additional partial definition of ModelViewControl. Pour afficher son contenu, dans l’Explorateur de solutions, ouvrez le menu contextuel pour le fichier et choisissez afficher le Code.To see its content, in Solution Explorer, open the shortcut menu for the file and choose View Code.

Sur le projet d’interface utilisateurAbout the UI Project

Lorsque vous mettez à jour le fichier de définition DSL pour définir votre propre DSL, vous devrez mettre à jour le contrôle dans le UI projet pour afficher votre DSL.When you update the DSL Definition file to define your own DSL, you will have to update the control in the UI project to display your DSL. Contrairement à la Dsl et DslPackage de projets, l’exemple UI projet n’est pas généré à partir de DslDefinitionl.dsl.Unlike the Dsl and DslPackage projects, the sample UI project is not generated from DslDefinitionl.dsl. Vous pouvez ajouter des fichiers .tt pour générer le code si vous le souhaitez, mais qui n’est pas abordé dans cette procédure pas à pas.You can add .tt files to generate the code if you want, although that is not covered in this walkthrough.

Mise à jour la définition DSLUpdating the DSL Definition

Suit que la définition DSL est utilisée dans cette procédure pas à pas.The following the DSL definition is used in this walkthrough.

DSL-Wpf-1

Pour mettre à jour la définition DSLTo update the DSL definition

  1. Ouvrez DslDefinition.dsl dans le concepteur DSL.Open DslDefinition.dsl in the DSL designer.

  2. Supprimer ExampleElementDelete ExampleElement

  3. Renommer le ExampleModel classe de domaine à Farm.Rename the ExampleModel domain class to Farm.

    Lui donner des propriétés de domaine supplémentaire nommées Size de type Int32, et IsOrganic de type booléenne.Give it additional domain properties named Size of type Int32, and IsOrganic of type Boolean.

    Note

    Si vous supprimez la classe de domaine racine et puis créez une nouvelle racine, vous devez réinitialiser la propriété de classe racine de l’éditeur.If you delete the root domain class and then create a new root, you will have to reset the Editor Root Class property. Dans Explorateur DSL, sélectionnez éditeur.In DSL Explorer, select Editor. Puis, dans la fenêtre Propriétés, définissez classe racine à Farm.Then in the Properties window, set Root Class to Farm.

  4. Utilisez le classe de domaine nommé outil pour créer les classes de domaine suivantes :Use the Named Domain Class tool to create the following domain classes:

    • Field -Définir une propriété de domaine supplémentaire nommée Size.Field - Give this an additional domain property named Size.

    • Animal -Dans la fenêtre Propriétés, définissez modificateur d’héritage à abstraite.Animal - In the Properties window, set Inheritance Modifier to Abstract.

  5. Utilisez le classe de domaine outil pour créer les classes suivantes :Use the Domain Class tool to create the following classes:

    • Sheep

    • Goat

  6. Utilisez le héritage outil Goat et Sheep hériter Animal.Use the Inheritance tool to make Goat and Sheep inherit from Animal.

  7. Utilisez le Embedding outil pour incorporer Field et Animal sous Farm.Use the Embedding tool to embed Field and Animal under Farm.

  8. Vous souhaiterez peut-être vider le diagramme.You might want to tidy the diagram. Pour réduire le nombre d’éléments en double, utilisez le mettre la sous-arborescence ici du menu contextuel des éléments de la feuille.To reduce the number of duplicate elements, use the Bring Subtree Here command on the shortcut menu of leaf elements.

  9. Transformer tous les modèles dans la barre d’outils de l’Explorateur de solutions.Transform All Templates in the toolbar of Solution Explorer.

  10. Générer le Dsl projet.Build the Dsl project.

    Note

    À ce stade, les autres projets ne seront pas généré sans erreur.At this stage, the other projects will not build without errors. Toutefois, nous souhaitons générer le projet Dsl afin que son assembly est disponible dans l’Assistant Source de données.However, we want to build the Dsl project so that its assembly is available to the Data Source Wizard.

Mise à jour le projet de l’interface utilisateurUpdating the UI Project

Vous pouvez maintenant créer un nouveau contrôle utilisateur qui affiche les informations stockées dans le modèle DSL.Now you can create a new user control that will display the information that is stored in the DSL model. Pour connecter le contrôle utilisateur pour le modèle le plus simple est par le biais des liaisons de données.The easiest way to connect the user control to the model is through data bindings. La liaison de type adaptateur nommé données ModelingBindingSource est spécifiquement conçu pour se connecter DSL à des interfaces non-VMSDK.The data binding adaptor type named ModelingBindingSource is specifically designed to connect DSLs to non-VMSDK interfaces.

Pour définir votre modèle DSL comme source de donnéesTo define your DSL model as a data source

  1. Sur le données menu, choisissez afficher les Sources de données.On the Data menu, choose Show Data Sources.

    Le des Sources de données fenêtre s’ouvre.The Data Sources window opens.

    Choisissez ajouter une nouvelle Source de données.Choose Add New Data Source. Le Assistant de Configuration de Source de données s’ouvre.The Data Source Configuration Wizard opens.

  2. Choisissez objet, suivant.Choose Object, Next.

    Développez Dsl, Company.FarmApp, puis sélectionnez batterie, qui est la classe racine de votre modèle.Expand Dsl, Company.FarmApp, and select Farm, which is the root class of your model. Choisissez Terminer.Choose Finish.

    Dans l’Explorateur de solutions, le UI projet contient désormais Properties\DataSources\Farm.datasourceIn Solution Explorer, the UI project now contains Properties\DataSources\Farm.datasource

    Les propriétés et les relations de votre classe de modèle s’affichent dans la fenêtre Sources de données.The properties and relationships of your model class appear in the Data Sources window.

    DslWpf-3

Pour se connecter de votre modèle à un formulaireTo connect your model to a form

  1. Dans le UI projet d’équipe, supprimez tous les fichiers .cs existant.In the UI project, delete all the existing .cs files.

  2. Ajouter un nouveau contrôle utilisateur fichier nommé FarmControl à la UI projet.Add a new User Control file named FarmControl to the UI project.

  3. Dans le des Sources de données fenêtre, dans le menu déroulant sur batterie, choisissez détails.In the Data Sources window, on the drop-down menu on Farm, choose Details.

    Conservez les paramètres par défaut pour les autres propriétés.Leave the default settings for the other properties.

  4. Ouvrez FarmControl.cs en mode design.Open FarmControl.cs in the design view.

    Faites glisser batterie à partir de la fenêtre Sources de données sur FarmControl.Drag Farm from the Data Sources window onto FarmControl.

    Un ensemble de contrôles apparaît, une pour chaque propriété.A set of controls appears, one for each property. Propriétés de relation ne génèrent pas de contrôles.The relationship properties do not generate controls.

  5. Supprimer farmBindingNavigator.Delete farmBindingNavigator. Cela est également générée automatiquement dans le FarmControl concepteur, mais il n’est pas utile pour cette application.This is also automatically generated in the FarmControl designer, but it is not useful for this application.

  6. À l’aide de la boîte à outils, créez deux instances de DataGridViewet nommez-les AnimalGridView et FieldGridView.Using the toolbox, create two instances of DataGridView, and name them AnimalGridView and FieldGridView.

    Note

    Une autre consiste à faire glisser les éléments d’animaux et les champs à partir de la fenêtre Sources de données sur le contrôle.An alternative step is to drag the Animals and Fields items from the Data Sources window onto the control. Cette action crée automatiquement des grilles de données et liaisons entre l’affichage de grille et de la source de données.This action automatically creates data grids and bindings between the grid view and the data source. Toutefois, cette liaison ne fonctionne pas correctement pour DSL.However, this binding does not work correctly for DSLs. Par conséquent, il est préférable de créer les grilles de données et les liaisons manuellement.Therefore it is better to create the data grids and bindings manually.

  7. Si la boîte à outils ne contient-elle pas le ModelingBindingSource outil, ajoutez-le.If the Toolbox does not contain the ModelingBindingSource tool, add it. Dans le menu contextuel de la données , onglet choisir choisir des éléments de.On the shortcut menu of the Data tab, choose Choose Items. Dans le choisir des éléments de boîte à outils boîte de dialogue, sélectionnez ModelingBindingSource à partir de la onglet .NET Framework.In the Choose Toolbox Items dialog, select ModelingBindingSource from the .NET Framework Tab.

  8. À l’aide de la boîte à outils, créez deux instances de ModelingBindingSourceet nommez-les AnimalBinding et FieldBinding.Using the Toolbox, create two instances of ModelingBindingSource, and name them AnimalBinding and FieldBinding.

  9. Définir le DataSource propriété de chaque ModelingBindingSource à farmBindingSource.Set the DataSource property of each ModelingBindingSource to farmBindingSource.

    Définir le DataMember propriété animaux ou champs.Set the DataMember property to Animals or Fields.

  10. Définir le DataSource propriétés de AnimalGridView à AnimalBindinget de FieldGridView à FieldBinding.Set the DataSource properties of AnimalGridView to AnimalBinding, and of FieldGridView to FieldBinding.

  11. Ajuster la disposition du contrôle à votre batterie de serveurs.Adjust the layout of the Farm control to your taste.

    Le ModelingBindingSource est un adaptateur qui remplit plusieurs fonctions qui sont spécifiques à DSL :The ModelingBindingSource is an adapter that performs several functions that are specific to DSLs:

  • Elle encapsule les mises à jour dans une Transaction de magasin VMSDK.It wraps updates in a VMSDK Store Transaction.

    Par exemple, lorsque l’utilisateur supprime une ligne à partir de la grille de vue de données, une liaison régulière entraînerait une exception de transaction.For example, when the user deletes a row from the data view grid, a regular binding would result in a transaction exception.

  • Elle garantit que, lorsque l’utilisateur sélectionne une ligne, la fenêtre Propriétés affiche les propriétés de l’élément de modèle correspondant, au lieu de la ligne de grille de données.It ensures that, when the user selects a row, the Properties window displays the properties of the corresponding model element, instead of the data grid row.

    DslWpf4 schéma des liens entre des sources de données et les vues.DslWpf4 Schema of links between data sources and views.

Pour terminer les liaisons du DSLTo complete the bindings to the DSL

  1. Ajoutez le code suivant dans un fichier de code séparé dans le UI projet :Add the following code in a separate code file in the UI project:

    using System.ComponentModel;
    using Microsoft.VisualStudio.Modeling;
    using Microsoft.VisualStudio.Modeling.Design;
    
    namespace Company.FarmApp
    {
      partial class FarmControl
      {
        public IContainer Components { get { return components; } }
    
        /// <summary>Binds the WinForms data source to the DSL model.
        /// </summary>
        /// <param name="nodelRoot">The root element of the model.</param>
        public void DataBind(ModelElement modelRoot)
        {
          WinFormsDataBindingHelper.PreInitializeDataSources(this);
          this.farmBindingSource.DataSource = modelRoot;
          WinFormsDataBindingHelper.InitializeDataSources(this);
        }
      }
    }
    
  2. Dans le DslPackage projet, modifier DslPackage\DocView.tt pour mettre à jour la définition de la variable suivante :In the DslPackage project, edit DslPackage\DocView.tt to update the following variable definition:

    string viewControlTypeName = "FarmControl";
    

Test du DSLTesting the DSL

La solution DSL permettre maintenant générer et exécuter, bien que vous souhaiterez peut-être ajouter d’autres améliorations ultérieurement.The DSL solution can now build and run, although you might want to add further improvements later.

Pour tester la DSLTo test the DSL

  1. Générez et exécutez la solution.Build and run the solution.

  2. Dans l’instance expérimentale de Visual Studio, ouvrez le exemple fichier.In the experimental instance of Visual Studio, open the Sample file.

  3. Dans le FarmApp Explorer, ouvrez le menu contextuel sur le batterie nœud racine, puis choisissez ajouter un nouveau chèvre.In the FarmApp Explorer, open the shortcut menu on the Farm root node, and choose Add New Goat.

    Goat1 s’affiche dans le animaux vue.Goat1 appears in the Animals view.

    Warning

    Vous devez utiliser le menu contextuel sur le batterie nœud, pas le animaux nœud.You must use the shortcut menu on the Farm node, not the Animals node.

  4. Sélectionnez le batterie nœud racine et afficher ses propriétés.Select the Farm root node and view its properties.

    Dans l’affichage du formulaire, modifiez le nom ou taille de la batterie de serveurs.In the form view, change the Name or Size of the farm.

    Lorsque vous quittez chaque champ dans le formulaire, les modifications apportées aux propriétés correspondantes dans la fenêtre Propriétés.When you navigate away from each field in the form, the corresponding property changes in the Properties window.

Amélioration du DSLEnhancing the DSL

Pour rendre les propriétés à mettre à jour immédiatementTo make the properties update immediately

  1. Dans la vue de conception de FarmControl.cs, sélectionnez un champ simple comme nom, une taille ou IsOrganic.In the design view of FarmControl.cs, select a simple field such as Name, Size or IsOrganic.

  2. Dans la fenêtre Propriétés, développez DataBindings et ouvrez (Avancé).In the Properties window, expand DataBindings and open (Advanced).

    Dans le mise en forme et liaison avancée boîte de dialogue, sous Mode de mise à jour de Source de données, choisissez OnPropertyChanged.In the Formatting and Advanced Binding dialog, under Data Source Update Mode, choose OnPropertyChanged.

  3. Générez et exécutez la solution.Build and run the solution.

    Vérifiez que lorsque vous modifiez le contenu du champ, la propriété correspondante d’immédiatement les modifications du modèle de batterie de serveurs.Verify that when you change the content of the field, the corresponding property of the Farm model changes immediately.

Pour fournir des boutons AjouterTo provide Add buttons

  1. Dans la vue de conception de FarmControl.cs, utilisez la boîte à outils pour créer un bouton sur le formulaire.In the design view of FarmControl.cs, use the toolbox to create a button on the form.

    Modifier le nom et le texte du bouton, par exemple pour New Sheep.Edit the name and text of the button, for example to New Sheep.

  2. Ouvrez le code derrière le bouton (par exemple en double-cliquant dessus).Open the code behind the button (for example by double-clicking it).

    Modifier comme suit :Edit it as follows:

    private void NewSheepButton_Click(object sender, EventArgs e)
    {
      using (Transaction t = farm.Store.TransactionManager.BeginTransaction("Add sheep"))
      {
        elementOperations.MergeElementGroup(farm,
          new ElementGroup(new Sheep(farm.Partition)));
        t.Commit();
      }
    }
    
    // The following code is shared with other add buttons:
    private ElementOperations operationsCache = null;
    private ElementOperations elementOperations
    {
      get
      {
        if (operationsCache == null)
        {
          operationsCache = new ElementOperations(farm.Store, farm.Partition);
        }
        return operationsCache;
      }
    }
    private Farm farm
    {
      get { return this.farmBindingSource.DataSource as Farm; }
    }
    

    Vous devrez également insérer la directive suivante :You will also need to insert the following directive:

    
    using Microsoft.VisualStudio.Modeling;
    
  3. Ajouter des boutons similaires de caprins et les champs.Add similar buttons for Goats and Fields.

  4. Générez et exécutez la solution.Build and run the solution.

  5. Vérifiez que le bouton Nouveau ajoute un élément.Verify that the new button adds an item. Le nouvel élément doit apparaître dans les deux l’Explorateur FarmApp et dans la vue de grille de données approprié.The new item should appear in both the FarmApp Explorer and in the appropriate data grid view.

    Vous devez être en mesure de modifier le nom de l’élément dans la vue de grille de données.You should be able to edit the name of the element in the data grid view. Vous pouvez également le supprimer à partir de là.You can also delete it from there.

    DSL-Wpf-2

À propos du code pour ajouter un élémentAbout the code to add an element

Pour les nouveaux boutons de l’élément, le code suivant de remplacement est légèrement plus simple.For the new element buttons, the following alternative code is slightly simpler.

private void NewSheepButton_Click(object sender, EventArgs e)
{
  using (Transaction t = farm.Store.TransactionManager.BeginTransaction("Add sheep"))
  {
    farm.Animals.Add(new Sheep(farm.Partition)); ;
    t.Commit();
  }
}

Toutefois, ce code ne définit pas un nom par défaut pour le nouvel élément.However, this code does not set a default name for the new item. Il ne s’exécute pas toute fusion personnalisée que vous avez pouvez définir dans le élément fusion Directives la DSL, et il ne s’exécute pas de code personnalisé de fusion qui ont été défini.It does not run any customized merge that you might have defined in the Element Merge Directives of the DSL, and it does not run any custom merge code that might have been defined.

Par conséquent, nous vous recommandons d’utiliser ElementOperations pour créer de nouveaux éléments.Therefore we recommend that you use ElementOperations to create new elements. Pour plus d’informations, consultez personnalisation de création d’éléments et le déplacement des.For more information, see Customizing Element Creation and Movement.

Voir aussiSee Also