Creare un linguaggio specifico del dominio basato su Windows Form
È possibile usare Windows Form per visualizzare lo stato di un modello DSL (Domain-Specific Language), anziché usare un diagramma DSL. Questo argomento illustra come eseguire l'associazione di un Windows Form a un linguaggio DSL usando Visual Studio Visualization and Modeling SDK.
L'immagine seguente mostra un'interfaccia utente di Windows Form e l'elenco dei modelli per un'istanza DSL:
Creare un Windows Form DSL
Il modello DSL di Progettazione WinForm minima crea un linguaggio DSL minimo che è possibile modificare in base alle proprie esigenze.
Creare un linguaggio DSL dal modello Di progettazione WinForm minimo.
In questa procedura dettagliata vengono considerati i nomi seguenti:
- Nome soluzione e DSL:
FarmApp
- Spazio dei nomi:
Company.FarmApp
- Nome soluzione e DSL:
Sperimentare l'esempio iniziale fornito dal modello:
Trasformare tutti i modelli.
Compilare ed eseguire l'esempio (CTRL+F5).
Nell'istanza sperimentale di Visual Studio aprire il
Sample
file nel progetto di debug.Si noti che viene visualizzato in un controllo Windows Form.
È anche possibile visualizzare gli elementi del modello visualizzati in Esplora risorse.
Aggiungere alcuni elementi nel form o in Explorer e notare che vengono visualizzati nell'altro display.
Nell'istanza principale di Visual Studio si notino i punti seguenti sulla soluzione DSL:
DslDefinition.dsl
non contiene elementi del diagramma. Ciò è dovuto al fatto che non si useranno diagrammi DSL per visualizzare i modelli di istanza di questo linguaggio DSL. Verrà invece associato un Windows Form al modello e gli elementi nel form visualizzeranno il modello.Oltre ai
Dsl
progetti eDslPackage
, la soluzione contiene un terzo progetto denominatoUI.
progetto dell'interfaccia utente contenente la definizione di un controllo Windows Form.DslPackage
dipende daUI
eUI
dipende daDsl
.DslPackage
Nel progettoUI\DocView.cs
contiene il codice che visualizza il controllo Windows Form definito nelUI
progetto.Il
UI
progetto contiene un esempio funzionante di un controllo modulo associato al linguaggio DSL. Tuttavia, non funzionerà quando è stata modificata la definizione DSL. IlUI
progetto contiene:Classe Windows Form denominata
ModelViewControl
.File denominato
DataBinding.cs
che contiene una definizione parziale aggiuntiva diModelViewControl
. Per visualizzarne il contenuto, in Esplora soluzioni aprire il menu di scelta rapida per il file e scegliere Visualizza codice.
Informazioni sul progetto dell'interfaccia utente
Quando si aggiorna il file di definizione DSL per definire il proprio DSL, sarà necessario aggiornare il controllo nel UI
progetto per visualizzare il linguaggio DSL. A differenza dei Dsl
progetti e DslPackage
, il progetto di esempio UI
non viene generato da DslDefinitionl.dsl
. È possibile aggiungere file con estensione tt per generare il codice, se necessario, anche se non è trattato in questa procedura dettagliata.
Aggiornare la definizione DSL
L'immagine seguente è la definizione DSL usata in questa procedura dettagliata.
Aprire DslDefinition.dsl nella finestra di progettazione DSL.
Delete ExampleElement
Rinominare la classe di dominio ExampleModel in
Farm
.Assegnare proprietà di dominio aggiuntive denominate di tipo Int32 e
IsOrganic
di tipo Boolean.Size
Nota
Se si elimina la classe di dominio radice e quindi si crea una nuova radice, sarà necessario reimpostare la proprietà Classe radice dell'editor. In Esplora DSL selezionare Editor. Quindi, nella Finestra Proprietà impostare Root Class (Classe radice) su
Farm
.Usare lo strumento Classe di dominio denominata per creare le classi di dominio seguenti:
Field
- Assegnare questa proprietà di dominio aggiuntiva denominataSize
.Animal
- Nella Finestra Proprietà impostare Modifica ereditarietà su Abstract.
Nota
Lo strumento Classe di dominio denominata e gli altri strumenti indicati in questa sezione sono disponibili nella finestra degli strumenti della casella degli strumenti . È possibile aprire o nascondere questa finestra con Visualizza>casella degli strumenti.
Usare lo strumento Classe di dominio per creare le classi seguenti:
Sheep
Goat
Usare lo strumento ereditarietà per creare
Goat
edSheep
ereditare daAnimal
.Usare lo strumento incorporamento per incorporare
Field
eAnimal
inFarm
.Potrebbe essere necessario riordinare il diagramma. Per ridurre il numero di elementi duplicati, usare il comando Bring Subtree Here nel menu di scelta rapida degli elementi foglia.
Trasformare tutti i modelli nella barra degli strumenti di Esplora soluzioni.
Compilare il progetto Dsl .
Nota
In questa fase, gli altri progetti non verranno compilati senza errori. Tuttavia, si vuole compilare il progetto Dsl in modo che il relativo assembly sia disponibile per la Creazione guidata origine dati.
Aggiornare il progetto dell'interfaccia utente
È ora possibile creare un nuovo controllo utente che visualizzerà le informazioni archiviate nel modello DSL. Il modo più semplice per connettere il controllo utente al modello consiste nell'usare i data binding. Il tipo di adattatore di data binding denominato ModelingBindingSource è progettato specificamente per connettere DSLs a interfacce non VMSDK.
Definire il modello DSL come origine dati
Scegliere Mostra origini dati dal menu Dati.
Verrà visualizzata la finestra Origini dati.
Scegliere Aggiungi nuova origine dati. Viene avviata la Configurazione guidata origine dati.
Scegliere Oggetto, Avanti.
Espandere Dsl, Company.FarmApp e selezionare Farm, ovvero la classe radice del modello. Scegliere Fine.
In Esplora soluzioni il progetto dell'interfaccia utente contiene ora proprietà\DataSources\Farm.datasource
Le proprietà e le relazioni della classe del modello vengono visualizzate nella finestra Origini dati.
Connessione il modello in un modulo
Nel progetto dell'interfaccia utente eliminare tutti i file con estensione cs esistenti.
Aggiungere un nuovo file di controllo utente denominato
FarmControl
al progetto dell'interfaccia utente .Nella finestra Origini dati scegliere Dettagli dal menu a discesa farm.
Lasciare le impostazioni predefinite per le altre proprietà.
Aprire FarmControl.cs nella visualizzazione struttura.
Trascinare Farm dalla finestra Origini dati in FarmControl.
Viene visualizzato un set di controlli, uno per ogni proprietà. Le proprietà della relazione non generano controlli.
Eliminare farmBindingNavigator. Questa operazione viene generata automaticamente anche nella
FarmControl
finestra di progettazione, ma non è utile per questa applicazione.Usando la casella degli strumenti, creare due istanze di DataGridView e denominarle
AnimalGridView
eFieldGridView
.Nota
Un passaggio alternativo consiste nel trascinare gli elementi Animali e Campi dalla finestra Origini dati nel controllo . Questa azione crea automaticamente griglie e associazioni di dati tra la visualizzazione griglia e l'origine dati. Tuttavia, questa associazione non funziona correttamente per le DSL. È quindi preferibile creare manualmente le griglie e i binding dei dati.
Se la casella degli strumenti non contiene lo strumento ModelingBindingSource , aggiungerlo. Scegliere Scegli elementi dal menu di scelta rapida della scheda Dati. Nella finestra di dialogo Scegli elementi della casella degli strumenti selezionare ModelingBindingSource dalla scheda .NET Framework .
Usando la casella degli strumenti, creare due istanze di ModelingBindingSource e denominarle
AnimalBinding
eFieldBinding
.Impostare la proprietà DataSource di ogni ModelingBindingSource su farmBindingSource.
Impostare la proprietà DataMember su Animals o Fields.
Impostare le proprietà DataSource di
AnimalGridView
suAnimalBinding
e suFieldGridView
FieldBinding
.Regolare il layout del controllo Farm in base al gusto.
ModelingBindingSource è un adattatore che esegue diverse funzioni specifiche per le DSL:
Esegue il wrapping degli aggiornamenti in una transazione dell'archivio VMSDK.
Ad esempio, quando l'utente elimina una riga dalla griglia di visualizzazione dati, un'associazione regolare genera un'eccezione di transazione.
Garantisce che, quando l'utente seleziona una riga, il Finestra Proprietà visualizza le proprietà dell'elemento del modello corrispondente anziché la riga della griglia di dati.
Schema dei collegamenti tra origini dati e viste.
Completare le associazioni al linguaggio DSL
Aggiungere il codice seguente in un file di codice separato nel progetto dell'interfaccia utente :
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); } } }
Nel progetto DslPackage modificare DslPackage\DocView.tt per aggiornare la definizione di variabile seguente:
string viewControlTypeName = "FarmControl";
Testare il linguaggio DSL
La soluzione DSL può ora compilare ed eseguire, anche se potrebbe essere necessario aggiungere altri miglioramenti in un secondo momento.
Compilare ed eseguire la soluzione.
Nell'istanza sperimentale di Visual Studio aprire il file sample .
In FarmApp Explorer aprire il menu di scelta rapida nel nodo Radice farm e scegliere Aggiungi nuova capra.
Goat1
appare nella visualizzazione Animali .Avviso
È necessario usare il menu di scelta rapida nel nodo Farm , non nel nodo Animali .
Selezionare il nodo radice della farm e visualizzarne le proprietà.
Nella visualizzazione maschera modificare il nome o le dimensioni della farm.
Quando si esce da ogni campo nel modulo, la proprietà corrispondente cambia nel Finestra Proprietà.
Migliorare il linguaggio DSL
Aggiornare immediatamente le proprietà
Nella visualizzazione progettazione di FarmControl.cs selezionare un campo semplice, ad esempio Nome, Dimensioni o IsOrganic.
Nella Finestra Proprietà espandere DataBindings e aprire (Avanzate).In the Finestra Proprietà, expand DataBindings and open (Advanced).
Nella finestra di dialogo Formattazione e associazione avanzata, in Modalità aggiornamento origine dati scegliere OnPropertyChanged.
Compilare ed eseguire la soluzione.
Verificare che quando si modifica il contenuto del campo, la proprietà corrispondente del modello farm viene modificata immediatamente.
Specificare i pulsanti Aggiungi
Nella visualizzazione struttura di FarmControl.cs usare la casella degli strumenti per creare un pulsante nel modulo.
Modificare il nome e il testo del pulsante, ad esempio in
New Sheep
.Aprire il codice dietro il pulsante , ad esempio facendo doppio clic su di esso.
Modificarlo come segue:
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; } }
È anche necessario inserire la direttiva seguente:
using Microsoft.VisualStudio.Modeling;
Aggiungere pulsanti simili per Capre e Campi.
Compilare ed eseguire la soluzione.
Verificare che il nuovo pulsante aggiunga un elemento. Il nuovo elemento dovrebbe essere visualizzato sia in FarmApp Explorer che nella visualizzazione griglia dati appropriata.
Dovrebbe essere possibile modificare il nome dell'elemento nella visualizzazione griglia dati. È anche possibile eliminarlo da questa posizione.
Informazioni sul codice per aggiungere un elemento
Per i pulsanti del nuovo elemento, il codice alternativo seguente è leggermente più semplice.
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();
}
}
Tuttavia, questo codice non imposta un nome predefinito per il nuovo elemento. Non esegue alcuna unione personalizzata che potrebbe essere stata definita nelle direttive di merge degli elementi del linguaggio DSL e non esegue alcun codice di unione personalizzato che potrebbe essere stato definito.
È pertanto consigliabile usare ElementOperations per creare nuovi elementi. Per altre informazioni, vedere Personalizzazione della creazione e dello spostamento degli elementi.