Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie können Windows Forms verwenden, um den Status eines DSL-Modells (Domain-Specific Language, domänenspezifische Sprache) anzuzeigen, anstatt ein DSL-Diagramm zu verwenden. Dieses Thema führt Sie durch das Binden eines Windows-Formulars an eine DSL mithilfe des Visualisierungs- und Modellierungs-SDK von Visual Studio.
Die folgende Abbildung zeigt die Benutzeroberfläche eines Windows-Formulars und den Modell-Explorer für eine DSL-Instanz:

Erstellen einer Windows Forms-DSL
Mit der DSL-Vorlage Minimal WinForm Designer (Minimaler WinForms-Designer) wird eine minimale DSL erstellt, die Sie an Ihre eigenen Anforderungen anpassen können.
Erstellen Sie eine DSL aus der Vorlage Minimal WinForm Designer.
In dieser exemplarischen Vorgehensweise werden die folgenden Namen verwendet:
- Projektmappen- und DSL-Name:
FarmApp - Namespace:
Company.FarmApp
- Projektmappen- und DSL-Name:
Experimentieren Sie mit dem anfänglichen Beispiel, das die Vorlage bereitstellt:
Transformieren Sie alle Vorlagen.
Erstellen Sie das Beispiel, und führen Sie es aus (STRG+F5).
Öffnen Sie in der experimentellen Instanz von Visual Studio die Datei
Sampleim Debugprojekt.Beachten Sie, dass sie in einem Windows Forms-Steuerelement angezeigt wird.
Sie können die Elemente des Modells auch im Explorer anzeigen.
Fügen Sie einige Elemente entweder im Formular oder im Explorer hinzu, und beachten Sie, dass sie in der anderen Anzeige angezeigt werden.
Beachten Sie in der Hauptinstanz von Visual Studio die folgenden Punkte zur DSL-Lösung:
DslDefinition.dslenthält keine Diagrammelemente. Dies liegt daran, dass Sie keine DSL-Diagramme verwenden, um Instanzmodelle dieser DSL anzuzeigen. Stattdessen binden Sie ein Windows-Formular an das Modell, und die Elemente im Formular zeigen das Modell an.Zusätzlich zu den
Dsl- undDslPackage-Projekten enthält die Projektmappe ein drittes Projekt namensUI.UI, das die Definition eines Windows Forms-Steuerelements enthält.DslPackagehängt vonUIundUIvonDslab.UI\DocView.csenthält imDslPackage-Projekt den Code, der das imUI-Projekt definierte Windows Forms-Steuerelement anzeigt.Das
UI-Projekt enthält ein funktionierendes Beispiel eines Formularsteuerelements, das an die DSL gebunden ist. Dies funktioniert jedoch nicht, wenn Sie die DSL-Definition geändert haben. DasUI-Projekt enthält Folgendes:Eine Windows Forms-Klasse namens
ModelViewControl.Eine Datei mit dem Namen
DataBinding.cs, die eine zusätzliche Teildefinition vonModelViewControlenthält. Um den Inhalt anzuzeigen, öffnen Sie im Projektmappen-Explorer das Kontextmenü für die Datei, und wählen Sie Code anzeigen aus.
Informationen zum UI-Projekt
Wenn Sie die DSL-Definitionsdatei aktualisieren, um Ihre eigene DSL zu definieren, müssen Sie das Steuerelement im UI-Projekt aktualisieren, um Ihre DSL anzuzeigen. Im Gegensatz zu den Dsl- und DslPackage-Projekten wird das UI-Beispielprojekt nicht aus DslDefinitionl.dsl generiert. Sie können TT-Dateien hinzufügen, um den Code auf Wunsch zu generieren. Dies wird in dieser exemplarischen Vorgehensweise jedoch nicht behandelt.
Aktualisieren der DSL-Definition
Die folgende Abbildung zeigt die DSL-Definition, die in dieser exemplarischen Vorgehensweise verwendet wird.

Öffnen Sie „dslDefinition.dsl“ im DSL-Designer.
Löschen Sie ExampleElement.
Benennen Sie die ExampleModel-Domänenklasse in
Farmum.Weisen Sie ihr zusätzliche Domäneneigenschaften mit dem Namen
Sizevom Typ Int32 undIsOrganicvom Typ Boolean zu.Hinweis
Wenn Sie die Stammdomänenklasse löschen und dann einen neuen Stamm erstellen, müssen Sie die Eigenschaft „Editor Root Class“ (Stammklasse des Editors) zurücksetzen. Wählen Sie im DSL-Explorer die Option Editor aus. Legen Sie dann im Eigenschaftenfenster Stammklasse auf den Wert
Farmfest.Verwenden Sie das Tool Named Domain Class (Benannte Domänenklasse), um die folgenden Domänenklassen zu erstellen:
Field: Weisen Sie eine zusätzliche Domäneneigenschaft mit dem NamenSizezu.Animal: Legen Sie im Eigenschaftenfenster Inheritance Modifier (Vererbungsmodifizierer) auf Abstract fest.
Hinweis
Das Tool Named Domain Class und die anderen in diesem Abschnitt genannten Tools befinden sich im Toolfenster Toolbox. Sie können dieses Fenster mit Ansicht>Toolbox öffnen oder ausblenden.
Verwenden Sie das Tool Domain Class (Domänenklasse), um die folgenden Klassen zu erstellen:
SheepGoat
Verwenden Sie das Tool Inheritance (Vererbung), um zu erreichen, dass
GoatundSheepvonAnimalerben.Verwenden Sie das Tool Embedding (Einbettung), um
FieldundAnimalunterFarmeinzubetten.Möglicherweise möchten Sie das Diagramm bereinigen. Um die Anzahl doppelter Elemente zu reduzieren, verwenden Sie den Befehl Bring Subtree Here (Teilstruktur hierhin verschieben) im Kontextmenü von Blattelementen.
Transformieren Sie alle Vorlagen auf der Symbolleiste des Projektmappen-Explorers.
Erstellen Sie das Dsl-Projekt.
Hinweis
In dieser Phase werden die anderen Projekte nicht fehlerfrei erstellt. Wir möchten das Dsl-Projekt jedoch so erstellen, dass seine Assembly für den Datenquellen-Assistenten verfügbar ist.
Aktualisieren des UI-Projekts
Nun können Sie ein neues Benutzersteuerelement erstellen, das die im DSL-Modell gespeicherten Informationen anzeigt. Die einfachste Möglichkeit, das Benutzersteuerelement mit dem Modell zu verbinden, sind Datenbindungen. Der Datenbindungsadaptertyp mit dem Namen ModelingBindingSource wurde speziell für das Verbinden von DSLs mit Nicht-VMSDK-Schnittstellen entwickelt.
Definieren Ihres DSL-Modells als Datenquelle
Klicken Sie im Menü Daten auf Datenquellen anzeigen.
Das Fenster Datenquellen wird geöffnet.
Wählen Sie Neue Datenquelle hinzufügen aus. Der Assistent zum Konfigurieren von Datenquellen wird geöffnet.
Wählen Sie Objekt und dannWeiter aus.
Erweitern Sie Dsl, Company.FarmApp, und wählen Sie Farm aus, die Stammklasse Ihres Modells. Klicken Sie auf Fertig stellen.
Im Projektmappen-Explorer enthält das UI-Projekt jetzt Properties\DataSources\Farm.datasource.
Die Eigenschaften und Beziehungen ihrer Modellklasse werden im Fenster „Datenquellen“ angezeigt.

Verbinden Ihres Modells mit einem Formular
Löschen Sie im UI-Projekt alle vorhandenen CS-Dateien.
Fügen Sie dem UI-Projekt eine neue
FarmControlBenutzersteuerungsdatei mit dem Namen hinzu.Wählen Sie im Fenster Datenquellen im Dropdownmenü unter Farm die Option Details aus.
Behalten Sie die Standardeinstellungen für die anderen Eigenschaften bei.
Öffnen Sie „FarmControl.cs“ in der Entwurfsansicht.
Ziehen Sie „Farm“ aus dem Fenster Datenquellen auf „FarmControl“.
Es wird ein Satz von Steuerelementen angezeigt, eines für jede Eigenschaft. Die Beziehungseigenschaften generieren keine Steuerelemente.
Löschen Sie farmBindingNavigator. Dies wird auch automatisch im
FarmControl-Designer generiert, ist aber für diese Anwendung nicht hilfreich.Erstellen Sie mithilfe der Toolbox zwei Instanzen von DataGridView, und nennen Sie diese
AnimalGridViewundFieldGridView.Hinweis
Ein alternativer Schritt besteht darin, die Elemente „Animals“ und „Fields“ aus dem Fenster „Datenquellen“ auf das Steuerelement zu ziehen. Diese Aktion erstellt automatisch Datenraster und Bindungen zwischen der Rasteransicht und der Datenquelle. Diese Bindung funktioniert für DSLs jedoch nicht ordnungsgemäß. Daher ist es besser, die Datenraster und Bindungen manuell zu erstellen.
Wenn die Toolbox das Tool ModelingBindingSource nicht enthält, fügen Sie es hinzu. Wählen Sie im Kontextmenü der Registerkarte Daten die Option Elemente auswählen aus. Wählen Sie im Dialogfeld Toolboxelemente auswählen die Option ModelingBindingSource auf der Registerkarte .NET Framework aus.
Erstellen Sie mit der Toolbox zwei Instanzen von ModelingBindingSource, und nennen Sie diese
AnimalBindingundFieldBinding.Legen Sie die DataSource-Eigenschaft jeder ModelingBindingSource auf farmBindingSource fest.
Legen Sie die DataMember-Eigenschaft auf Animals oder Fields fest.
Legen Sie die DataSource-Eigenschaften von
AnimalGridViewaufAnimalBindingund vonFieldGridViewaufFieldBindingfest.Passen Sie das Layout des Farm-Steuerelements an Ihre Vorstellungen an.
ModelingBindingSource ist ein Adapter, der mehrere DSLs-spezifische Funktionen ausführt:
Er umschließt Updates in einer VMSDK-Speichertransaktion.
Wenn der Benutzer beispielsweise eine Zeile aus dem Datenansichtsraster löscht, würde eine reguläre Bindung zu einer Transaktionsausnahme führen.
Dadurch wird sichergestellt, dass das Eigenschaftenfenster die Eigenschaften des entsprechenden Modellelements anstelle der Datenrasterzeile anzeigt, wenn der Benutzer eine Zeile auswählt.

Schema der Verknüpfungen zwischen Datenquellen und Ansichten.
Abschließen der Bindungen an die DSL
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); } } }Bearbeiten Sie im DslPackage-Projekt DslPackage\DocView.tt, um die folgende Variablendefinition zu aktualisieren:
string viewControlTypeName = "FarmControl";
Testen der DSL
Die DSL-Lösung kann jetzt erstellt und ausgeführt werden, auch wenn Sie später möglicherweise weitere Verbesserungen hinzufügen möchten.
Erstellen Sie das Projekt, und führen Sie es aus.
Öffnen Sie in der experimentellen Instanz von Visual Studio die Datei Sample.
Öffnen Sie im FarmApp-Explorer das Kontextmenü im Stammknoten Farm, und wählen Sie Add New Goat (Neue Ziege hinzufügen) aus.
Goat1wird in der Ansicht Animals (Tiere) angezeigt.Warnung
Sie müssen das Kontextmenü im Knoten Farm verwenden, nicht den Knoten Animals (Tiere).
Wählen Sie den Stammknoten Farm aus, und zeigen Sie dessen Eigenschaften an.
Ändern Sie in der Formularansicht den Namen oder die Größe der Farm.
Wenn Sie weg von jedem Feld im Formular navigieren, ändert sich die entsprechende Eigenschaft im Eigenschaftenfenster.
Optimieren der DSL
Sofortiges Aktualisieren der Eigenschaften
Wählen Sie in der Entwurfsansicht von „FarmControl.cs“ ein einfaches Feld aus, z. B. „Name“, „Size“ (Größe) oder „IsOrganic“.
Erweitern Sie im Eigenschaftenfenster DataBindings, und öffnen Sie (Advanced) (Erweitert).
Wählen Sie im Dialogfeld Formatierung und erweiterte Bindung unter Datenquellen-Updatemodus die Option OnPropertyChanged aus.
Erstellen Sie das Projekt, und führen Sie es aus.
Stellen Sie sicher, dass sich die entsprechende Eigenschaft des Farm-Modells sofort ändert, wenn Sie den Inhalt des Felds ändern.
Bereitstellen von Schaltflächen „Hinzufügen“
Verwenden Sie in der Entwurfsansicht von „FarmControl.cs“ die Toolbox, um eine Schaltfläche im Formular zu erstellen.
Ändern Sie den Namen und den Text der Schaltfläche, z. B. in
New Sheep.Öffnen Sie den Code hinter der Schaltfläche (z. B., indem Sie darauf doppelklicken).
Bearbeiten Sie ihn 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; } }Sie müssen auch die folgende Anweisung einfügen:
using Microsoft.VisualStudio.Modeling;Fügen Sie ähnliche Schaltflächen für „Goats“ (Ziegen) und „Fields“ (Felder) hinzu.
Erstellen Sie das Projekt, und führen Sie es aus.
Vergewissern Sie sich, dass die neue Schaltfläche ein Element hinzufügt. Das neue Element sollte sowohl im FarmApp-Explorer als auch in der entsprechenden Datenrasteransicht angezeigt werden.
Sie sollten in der Lage sein, den Namen des Elements in der Datenrasteransicht zu bearbeiten. Sie können es dort auch löschen.

Informationen zum Code zum Hinzufügen eines Elements
Für die neuen Elementschaltflächen ist der folgende 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();
}
}
Dieser Code legt jedoch keinen Standardnamen für das neue Element fest. Es werden keine benutzerdefinierten Merges ausgeführt, die Sie möglicherweise in den Elementmerge-Anweisung der DSL definiert haben, und es wird kein benutzerdefinierter Mergecode ausgeführt, 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.