Création d'un langage spécifique à un domaine basé sur Windows Forms
Vous pouvez utiliser Windows Forms pour afficher l'état d'un modèle de (DSL) de langage spécifique au domaine, au lieu d'utiliser un diagramme DSL. Cette rubrique vous démarrez en liant un Windows formes à un DSL, à l'aide de la visualisation d' Visual Studio et de modélisation le Kit de développement logiciel.
Une instance DSL, affichant un Windows formes interface utilisateur et l'explorateur de modèles.
Créer un Windows Forms DSL
Le modèle Concepteur minimal de WinForm crée un domaine (DSL minimales que vous pouvez modifier pour répondre à vos besoins.
Pour créer un WinForms minimal DSL
Créez un DSL du modèle Concepteur minimal de WinForm .
Dans cette procédure pas - à - pas, les noms suivants sont assumés :
Solution et nom DSL
FarmApp
Espace de noms
Company.FarmApp
Expérience avec l'exemple initiale que le modèle fournit :
Transformez tous les modèles.
Générez et exécutez l'exempleCTRL+F5().
Dans l'instance expérimentale de Visual Studio, ouvrez le fichier d' Sample dans le projet de débogage.
Notez qu'il est affiché dans un contrôle Windows Forms.
Vous pouvez également consulter les éléments du modèle affiché dans l'explorateur.
Ajoutez des éléments dans le formulaire ou l'explorateur, et remarquez qu'ils apparaissent dans l'autre affichage.
Dans l'instance principale de Visual Studio, notez les points suivants à propos de la solution DSL :
DslDefinition.dsl ne contient aucun élément de diagramme. C'est parce que vous n'utiliserez pas les diagrammes DSL pour afficher des modèles d'instance de ce langage DSL. À la place, vous lierez un Windows formes au modèle, et les éléments du formulaire affichent le modèle.
Outre les projets d' Dsl et d' DslPackage , la solution contient un projet d' UI. nommé le troisième par projet interface utilisateur contient la définition d'un contrôle Windows Forms. DslPackage dépend d' UI, et UI dépend d' Dsl.
Dans le projet d' DslPackage , UI\DocView.cs contient le code qui affiche le contrôle Windows Forms qui est défini dans le projet d' UI .
Le projet d' UI contient un exemple fonctionnels d'un contrôle de formulaire lié au langage DSL. Toutefois, cela ne fonctionnera pas lorsque vous avez modifié la définition de langage spécifique à un domaine. Le projet d' UI contient :
Une classe Windows Forms nommée ModelViewControl.
Un fichier nommé DataBinding.cs qui contient une définition partielle supplémentaire d' ModelViewControl. Pour afficher son contenu, dans Explorateur de solutions, ouvrez le menu contextuel du fichier et choisissez Afficher le code.
Sur le projet de l'interface utilisateur
Lorsque vous placez le fichier de définition de langage spécifique à un domaine pour définir votre propre DSL, vous devez mettre à jour le contrôle dans le projet d' UI d'afficher votre DSL. Contrairement aux projets d' Dsl et d' DslPackage , le projet d' UI d'exemple n'est pas généré à DslDefinitionl.dsl. Vous pouvez ajouter des fichiers .tout pour générer le code si vous le souhaitez, bien que cela ne soit pas abordé dans cette procédure pas - à - pas.
Mettre à jour la définition de langage spécifique à un domaine
Ce qui suit la définition DSL est utilisé dans cette procédure pas - à - pas.
Pour mettre à jour la définition de langage spécifique à un domaine
Ouvrez DslDefinition.dsl dans le concepteur de langage spécifique à un domaine.
Suppression ExampleElement
Renommez la classe de domaine ExampleModel à ferme.
Donnez -lui les propriétés de champ supplémentaires nommées taille de type Int32, et à IsOrganic de type Boolean.
Notes
Si vous supprimez la classe de domaine racine puis créez une nouvelle racine, vous devez réinitialiser la propriété de la classe racine de l'éditeur.Dans L'explorateur DSL, éditeursélectionnez.Puis dans la fenêtre Propriétés, affectez classe racine à ferme.
Utilisez l'outil Domain Classe nommé pour créer des classes de domaine suivantes :
champ – donnez à faire une propriété de domaine supplémentaire nommée taille.
animal )dans la fenêtre Propriétés, définissez modificateur d'héritage à résumé.
Utilisez l'outil classe de domaine pour créer des classes suivantes :
Moutons
Chèvre
Utilisez l'outil Héritage pour ce chèvre et moutons hériter d' animal.
Utilisez l'outil Incorporer pour incorporer champ et animal sous ferme.
Vous pouvez souhaiter ranger le diagramme. Pour réduire le nombre d'éléments en double, utilisez la commande Modifiez la sous-arborescence ici dans le menu contextuel des éléments de feuille.
Transformez tous les modèles dans la barre d'outils de l'explorateur de solutions.
Générez le projet DSL .
Notes
À ce stade, les autres projets ne génèrent pas sans erreur.Toutefois, nous souhaitons générer le projet DSL afin que son assembly est disponible à l'Assistant Source de données.
Mettre à jour le projet de l'interface utilisateur
Vous pouvez maintenant créer un contrôle utilisateur qui affiche les informations stockées dans le modèle DSL. La façon la plus facile de connecter le contrôle utilisateur au modèle est via des liaisons de données. Le type ModelingBindingSource nommé d'adaptateur de liaison de données est conçu pour connecter DSLs aux interfaces de non-VMSDK.
Pour définir votre modèle DSL comme source de données
Dans le menu Données , choisissez Sources de données show.
La fenêtre Sources de données s'ouvre.
Choisissez ajoutez la nouvelle source de données. L'Assistant Configuration de source de données s'ouvre.
Choisissez objet, Suivant.
Développez DSL, Company.FarmApp, puis sélectionnez ferme, qui est la classe racine de votre modèle. Choisissez Terminer.
Dans l'explorateur de solutions, le projet interface utilisateur contient maintenant 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.
Pour connecter votre modèle à un formulaire
Dans le projet interface utilisateur , supprimez tous les fichiers existants .cs.
Ajoutez un nouveau fichier Contrôle utilisateur nommé FarmControl au projet interface utilisateur .
Dans la fenêtre sources de données , dans le menu déroulant sur ferme, choisissez Détails.
Conservez les paramètres par défaut pour les autres propriétés.
Ouvrez FarmControl.cs en mode Design.
Faites glisser ferme de la fenêtre sources de données sur FarmControl.
Un ensemble de contrôles s'affiche, un pour chaque propriété. Les propriétés des relations ne génèrent pas de contrôles.
Suppression farmBindingNavigator. Il est également généré automatiquement dans le concepteur de FarmControl , mais il n'est pas utile pour cette application.
À l'aide de la boîte à outils, créez deux instances DataGridView, et nommez -les AnimalGridView et FieldGridView.
Notes
Une autre étape consiste à faire glisser les animaux et champs des éléments de la fenêtre sources de données sur le contrôle.Cette action crée automatiquement des grilles et des liaisons de données entre la vue Grille et la source de données.Toutefois, cette liaison ne fonctionne pas correctement pour DSLs.Par conséquent il est préférable de créer les grilles et les liaisons de données manuellement.
Si la boîte à outils ne contient pas l'outil ModelingBindingSource , ajoutez-le. Dans le menu contextuel de l'onglet Données , choisissez choisissez les éléments. Dans la boîte de dialogue Sélectionnez les éléments de boîte à outils , ModelingBindingSource choisi onglet.NET Framework.
À l'aide de la boîte à outils, créez deux instances ModelingBindingSource, et nommez -les AnimalBinding et FieldBinding.
Affectez à la propriété source de données de chaque ModelingBindingSource à farmBindingSource.
Affectez à la propriété DataMember à animaux ou à champs.
Définissez les propriétés source de données d' AnimalGridView à AnimalBinding, et de FieldGridView à FieldBinding.
Ajuster la disposition du contrôle de batterie à votre goût.
ModelingBindingSource Est un adaptateur qui remplit plusieurs fonctions qui sont spécifiques à DSLs :
Il encapsule des mises à jour dans une transaction du magasin VMSDK.
Par exemple, lorsque l'utilisateur supprime une ligne de la grille de vue de données, une liaison normale entraînerait une exception de transaction.
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.
Schéma des liens entre les sources de données et les vues.
Pour terminer les liaisons au langage DSL
Ajoutez le code suivant dans un fichier distinct de code du projet interface utilisateur :
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); } } }
Dans le projet DslPackage , modification DslPackage \DocView .tout de mettre à jour la définition de variable suivante :
string viewControlTypeName = "FarmControl";
Test du langage DSL
La solution DSL peut maintenant générer et exécuter, même si vous pouvez ajouter d'autres améliorations ultérieurement.
Pour tester le langage DSL
Générez et exécutez la solution.
Dans l'instance expérimentale de Visual Studio, ouvrez le fichier Exemple .
Dans explorateur de FarmApp, ouvrez le menu contextuel du nœud racine ferme , puis choisissez ajoutez la nouvelle chèvre.
Goat1 s'affiche dans la vue animaux .
Avertissement
Vous devez utiliser le menu contextuel du nœud ferme , pas le nœud animaux .
Sélectionnez le nœud racine ferme et afficher ses propriétés.
En mode formulaire, modifiez Nom ou Taille de la batterie.
Lorsque vous naviguez loin de chaque champ dans le formulaire, la propriété correspondante change dans la fenêtre Propriétés.
Améliorer le langage DSL
Pour effectuer la mise à jour de propriétés immédiatement
En mode Design de FarmControl.cs, sélectionnez un champ simple tel que le nom, la taille ou l'IsOrganic.
Dans la fenêtre Propriétés, développez liaisons de données et ouvrez (Avancé).
Dans la boîte de dialogue Mise en forme et liaison avancée , sous Mode mise à jour de la source de données, choisissez OnPropertyChanged.
Générez et exécutez la solution.
Vérifiez que lorsque vous modifiez le contenu du champ, la propriété du modèle de batterie change immédiatement.
Pour fournir ajoutez des boutons
En mode Design de FarmControl.cs, utilisez la boîte à outils pour créer un bouton sur le formulaire.
Modifiez le nom et le texte du bouton, par exemple à nouveaux moutons.
Ouvrez le code derrière le bouton (par exemple en double-cliquant dessus).
Modifiez -le comme suit :
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 :
using Microsoft.VisualStudio.Modeling;
Ajoutez des boutons similaires pour les chèvres les champs et.
Générez et exécutez la solution.
Vérifiez que le nouveau bouton ajoute un élément. Le nouvel élément doit s'afficher dans l'explorateur de FarmApp et dans la vue Grille appropriée de données.
Vous devez être en mesure de modifier le nom de l'élément dans la vue Grille de données. Vous pouvez également supprimer la à partir de celui-ci.
Sur le code pour ajouter un élément
Pour les nouveaux boutons d'élément, un autre code suivant est légèrement plus simple.
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 de nom par défaut pour le nouvel élément. Il n'exécute aucune fusion personnalisée que vous avez peut-être définie dans directives de fusion d'élément du langage DSL, et il n'effectue pas de code personnalisé de fusion qui peut avoir été défini.
C'est pourquoi nous vous recommandons ElementOperations pour créer de nouveaux éléments. Pour plus d’informations, consultez Personnalisation de la création et du mouvement des éléments.
Voir aussi
Concepts
Comment : définir un langage spécifique à un domaine
Kit de développement logiciel de modélisation pour Visual Studio - Langages spécifiques à un domaine
Autres ressources
Écriture de code pour personnaliser un langage spécifique à un domaine