Erstellen einer Windows Forms-basierten domänenspezifischen Sprache
Sie können Windows Forms verwenden, um den Zustand eines DSL-Modells (domänenspezifische Sprache) anzuzeigen, anstatt ein DSL-Diagramm zu verwenden.Dieses Thema führt Sie durch das Binden eines Windows Form an eine DSL mithilfe des Visualisierungs- und Modellierungs-SDK von Visual Studio.
Eine DSL-Instanz, die eine Windows Form-Benutzeroberfläche und den Modell-Explorer anzeigt.
Erstellen einer Windows Forms-DSL
Die DSL-Vorlage Minimaler WinForm-Designer erstellt ein minimales DSL, das entsprechend den Benutzeranforderungen geändert werden kann.
So erstellen Sie eine minimale WinForms-DSL
Erstellen Sie ein DSL aus der Minimalen WinForm-Designer Vorlage.
In dieser exemplarischen Vorgehensweise wird von den folgenden Namen ausgegangen:
Projektmappe und DSL-Name
FarmApp
Namespace
Company.FarmApp
Experimentieren Sie mit dem ursprünglichen Beispiel, das die Vorlage bereitgestellt:
Transformieren Sie alle Vorlagen.
Erstellen Sie das Beispiel, und führen Sie es aus. (CTRL+F5).
Öffnen Sie in der experimentellen Instanz von Visual Studio die Sample-Datei im Debugprojekt.
Beachten Sie, dass sie in einem Windows Forms-Steuerelement angezeigt wird.
Sie können auch die Elemente des Modells im Explorer anzeigen.
Fügen Sie mehrere Elemente entweder im Projektmappen-Explorer oder im Formular hinzu, und beachten Sie, dass diese in der anderen Anzeige angezeigt werden.
In der Hauptinstanz von Visual Studio, sollten Sie die folgenden Punkte bezüglich der DSL-Projektmappe beachten:
DslDefinition.dsl Die Gruppe enthält keine Diagrammelemente.Dies liegt daran, dass Sie keine DSL-Diagramme verwenden, um Instanzmodelle für dieses DSL anzuzeigen.Stattdessen binden Sie eine Windows Form an das Modell, und die Elemente in der Form zeigen das Modell an.
Zusätzlich zu den Dsl und DslPackage-Projekten enthält die Projektmappe ein drittes Projekt mit dem Namen UI.UI-Projekt enthält die Definition eines Windows Forms-Steuerelements.DslPackage hängt von UI ab und UI hängt von Dsl ab.
Im DslPackage-Projekt enthält UI\DocView.cs den Code, der das Windows Forms-Steuerelement anzeigt, das im UI-Projekt definiert ist.
Das UI-Projekt enthält ein funktionstüchtiges Beispiel eines Formsteuerelements, das an die DSL gebunden ist.Es funktioniert jedoch nicht, wenn Sie die DSL-Definition geändert haben.Das UI-Projekt enthält:
Eine Windows-Formular-Klasse mit dem Namen ModelViewControl.
Eine Datei mit dem Namen DataBinding.cs, die eine weitere partielle Definition von ModelViewControl enthält.Um den Inhalt anzuzeigen, öffnen Sie im Projektmappen-Explorer das Kontextmenü für die Datei, und wählen Sie Code anzeigen aus.
Über das Benutzeroberflächen-Projekt
Wenn Sie die Datei "DSL-Definitionen" aktualisieren, um ein eigenes DSL zu definieren, müssen Sie das Steuerelement im UI-Projekt aktualisieren, um die DSL anzuzeigen.Im Gegensatz zum Dsl- und DslPackage-Projekte wird das UI-Beispielprojekt nicht aus DslDefinitionl.dsl generiert.Sie können .tt-Dateien hinzufügen, um den Code zu generieren, wenn Sie diese möchten, obwohl das in dieser exemplarischen Vorgehensweise nicht abgedeckt wird.
Die DSL-Definition aktualisieren
Die folgende DSL-Definition wird in dieser Komplettlösung verwendet.
So aktualisieren Sie die DSL-Definition
Öffnen Sie DslDefinition.dsl im DSL-Designer.
ExampleElement löschen
Benennen Sie die ExampleModel Domänenklasse zu Farm um.
Geben Sie ihm die zusätzlichen Domäneneigenschaften mit Namen Size des Typs Int32und IsOrganic des Typs Boolean.
Hinweis Wenn Sie die Stammdomänen-Klasse löschen und dann einen neuen Stamm erstellen, müssen Sie die Editor Root Class-Eigenschaft zurücksetzen.In DSL-Explorer wählen Sie Editor aus.Anschließend legen Sie die Stammklasse im Eigenschaftenfenster auf Farm fest.
Verwenden Sie das Tool Benannte Domänenklasse, um die folgenden Domänenklassen zu erstellen:
Feld – Geben Sie diesem eine zusätzliche Domäneneigenschaft, die als Größe benannt ist.
Animal – Legen Sie im Eigenschaftenfenster Inheritance Modifier auf Abstract fest.
Verwenden Sie das Tool Domain Class, um die folgenden Klassen zu erstellen:
Schafe
Ziege
Verwenden Sie das Tool Vererbung, um Goat und Sheep von Tier zu erben.
Verwenden Sie das Tool Einbetten, um Field und Animal unter Farm einzubetten.
Sie sollten das Diagramm aufräumen.Um die Anzahl von doppelten Elemente zu reduzieren, verwenden Sie den Befehl Teilstruktur hierher im Kontextmenü von Endelementen.
Alle Vorlagen transformieren in der Werkzeugleiste des Projektmappen-Explorer.
Erstellen Sie das Dsl Projekt
Hinweis In dieser Phase werden die anderen Projekte nicht ohne Fehler erstellt.Allerdings soll das DSL-Projekt so erstellt werden, dass die Assembly für den Datenquellenassistenten verfügbar ist.
UI-Projektupdate
Jetzt können Sie ein neues Benutzersteuerelement erstellen, das die Informationen, die im DSL-Modell gespeichert sind, anzeigt.Die einfachste Vorgehensweise, die Benutzersteuerung mit dem Modell zu verbinden, ist durch Datenbindungen.Der Datenbindungs-Adaptertyp mit dem Namen ModelingBindingSource wurde speziell konzipiert, um DSLs mit Nicht-VMSDK-Schnittstellen zu verbinden.
So definieren Sie das DSL-Modell als Datenquelle
Wählen Sie im Menü Daten die Option Datenquellen anzeigen aus.
Das Fenster Datenquellen wird geöffnet.
Wählen Sie Neue Datenquelle hinzufügen ausDer Assistent zum Konfigurieren von Datenquellen wird geöffnet.
Wählen Sie Objekt, Weiter aus.
Erweitern Sie Dsl, Company.FarmApp und wählen Sie Farm aus. Das ist die Stammklasse des Modells.Wählen Sie Fertig stellen aus.
Im Projektmappen-Explorer enthält das UI-Projekt jetzt Properties\DataSources\Farm.datasource
Die Eigenschaften und Beziehungen Ihrer Modellklasse werden im Datenquellenfenster angezeigt.
So verbinden Sie das Modell mit einem Formular
Löschen Sie im UI-Projekt alle vorhandenen .cs-Dateien.
Fügen Sie dem UI-Projekt eine neue Benutzersteuerelement Datei mit Namen FarmControl hinzu.
Klicken Sie im Fenster Datenquellen im Dropdownmenü auf Farm und wählen Sie Details aus.
Standardeinstellungen für die anderen Eigenschaften beibehalten.
Öffnen Sie FarmControl.cs in der Entwurfsansicht.
Ziehen Sie Farm aus dem Tabelle aus dem Datenquellenfenster auf FarmControl.
Ein Satz von Steuerelementen wird angezeigt, einer für jede Eigenschaft.Die Beziehungseigenschaften generieren keine Steuerelemente.
farmBindingNavigator löschen.Dies wird ebenfalls automatisch im FarmControl-Designer generiert, ist jedoch für diese Anwendung nicht hilfreich.
Unter Verwenden der Toolbox erstellen Sie zwei Instanzen von DataGridView, und benennen Sie sie AnimalGridView und FieldGridView.
Hinweis Ein alternativer Schritt besteht darin, die Tier-Feldelemente aus dem Datenquellenfenster auf das Steuerelement zu ziehen.Diese Aktion stellt automatisch Datenraster und Bindungen zwischen dem Raster und der Datenquelle her.Diese Bindung funktioniert jedoch nicht ordnungsgemäß für DSLs.Daher empfiehlt es sich, die Datenraster und Bindungen manuell zu erstellen.
Wenn die Toolbox das ModelingBindingSource Tool nicht enthält, fügen Sie es hinzu.Wählen Sie im Kontextmenü auf der Registerkarte DatenElemente auswählen aus.Wählen Sie im Dialogfeld Toolboxelemente auswählen die Option ModelingBindingSource auf der Registerkarte .NET Framework aus.
Unter Verwenden der Toolbox erstellen Sie zwei Instanzen von ModelingBindingSource, und benennen Sie sie AnimalBinding und FieldBinding.
Legen Sie die DataSource-Eigenschaft der einzelnen ModelingBindingSource-Elemente auf farmBindingSource fest.
Legen Sie die DataMember-Eigenschaft auf Tiere oder Felder fest.
Legen Sie die DataSource-Eigenschaften unter AnimalGridView auf AnimalBinding und unter FieldGridView auf FieldBinding fest.
Passen Sie das Layout des Steuerelements der Farm nach Ihrem Geschmack an.
ModelingBindingSource ist ein Adapter, der mehrere DSL-spezifische Aufgaben ausführt:
Er umschließt Updates in einer VMSDK-Speicher-Transaktion.
Wenn der Benutzer beispielsweise eine Zeile im Datenansichtsraster löscht, würde eine reguläre Bindung zu einer Transaktiosausnahme führen.
Es stellt sicher, dass, wenn der Benutzer eine Zeile auswählt, das Eigenschaftenfenster die Eigenschaften des entsprechenden Modellelements anstelle der Datenrasterzeile anzeigt.
Schema von Links zwischen Datenquellen und Ansichten.
So stellen Sie die DSL-Bindungen her
Fügen Sie den folgenden Code in einer separaten Codedatei im UI Projekt hinzu:
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); } } }
Im DslPackage-Projekt bearbeiten Sie DslPackage\DocView.tt, um die folgende Variablendefinition zu aktualisieren:
string viewControlTypeName = "FarmControl";
Testen von DSL
Die DSL-Projektmappe kann jetzt entstehen und laufen, obwohl Sie später vielleicht weitere Verbesserungen hinzufügen möchten.
So testen Sie die DSL
Erstellen Sie die Projektmappe, und führen Sie sie aus
Öffnen Sie in der experimentellen Instanz von Visual Studio Sie die Datei Beispiel.
In FarmApp-Explorer öffnen Sie das Kontextmenü im Farm-Stammknoten, und wählen Sie Neue Ziege hinzufügen aus.
Goat1 wird in der Tiere Ansicht angezeigt.
Vorsicht Sie müssen das Kontextmenü im Farm-Knoten verwenden, nicht im Animals-Knoten verwenden.
Wählen Sie den Stammknoten Farm aus, und zeigen Sie seine Eigenschaften an.
Ändern Sie in der Formularansicht Name oder Größe der Farm.
Wenn Sie von den einzelnen Feldern im Formular navigieren, wird die entsprechende Eigenschaft im Eigenschaftenfenster geändert.
Verbessern des DSL
So legen Sie ein sofortiges Update der Eigenschaften fest
Wählen Sie in der Entwurfsansicht von FarmControl.cs ein einfaches Feld wie Name, Größe oder IsOrganic aus.
Erweitern Sie im Eigenschaftenfenster DataBindings, und öffnen Sie (Erweitert).
Im Dialogfeld Formatierung und erweiterte Bindung unter Datenquellen-Aktualisierungsmodus wählen Sie OnPropertyChanged aus.
Erstellen Sie die Projektmappe, und führen Sie sie aus
Stellen Sie sicher, dass, wenn Sie den Inhalt des Felds geändert haben, die zugehörige Eigenschaft des Farmmodells ebenfalls sofort geändert wird.
So stellen Sie Schaltflächen zum Hinzufügen bereit
Verwenden Sie in der Entwurfsansicht von FarmControl.cs die Toolbox, um eine Schaltfläche auf dem Formular zu erstellen.
Bearbeiten Sie den Namen und den Text der Schaltfläche z.B. zu Neue Schafe.
Öffnen Sie den Code hinter der Schaltfläche (z. B. durch Doppelklicken auf diese).
Bearbeiten Sie sie wie folgt:
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; } }
Außerdem müssen Sie die folgenden Direktiven einfügen:
using Microsoft.VisualStudio.Modeling;
Fügen Sie ähnliche Schaltflächen für Ziegen und Felder hinzu.
Erstellen Sie die Projektmappe, und führen Sie sie aus
Überprüfen Sie, ob die neue Schaltfläche ein Element hinzufügt.Das neue Element wird sowohl im FarmApp-Explorer als auch in der Datenrasteransicht angezeigt.
Sie sollten in der Lage sein, den Namen des Elements in der Ansicht Datenraster zu bearbeiten.Sie können es auch hier löschen.
Über den Code zum Hinzufügen eines Elements
Für die neuen Element-Schaltflächen ist der folgenden alternative Code etwas einfacher.
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();
}
}
Allerdings legt dieser Code keinen Standardnamen für das neue Element fest.Es führt keine benutzerdefinierte Zusammenführung aus, die Sie möglicherweise in den Elementzusammenführungsdirektiven der DSL definiert haben, und auch keinen benutzerdefinierten Zusammenführungscode, der möglicherweise definiert wurde.
Daher wird empfohlen, ElementOperations zu verwenden, um neue Elemente zu erstellen.Weitere Informationen finden Sie unter Anpassen der Elementerstellung und -verschiebung.
Siehe auch
Konzepte
So definieren Sie eine domänenspezifische Sprache
Visualisierungs- und Modellierungs-SDK - Domänenspezifische Sprachen
Weitere Ressourcen
Schreiben von Code zum Anpassen einer domänenspezifischen Sprache