Condividi tramite


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:

DSL instance in Visual Studio

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.

  1. 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
  2. Sperimentare l'esempio iniziale fornito dal modello:

    1. Trasformare tutti i modelli.

    2. Compilare ed eseguire l'esempio (CTRL+F5).

    3. 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 denominato UI.progetto dell'interfaccia utente contenente la definizione di un controllo Windows Form. DslPackage dipende da UIe UI dipende da Dsl.

  • DslPackage Nel progetto UI\DocView.cs contiene il codice che visualizza il controllo Windows Form definito nel UI 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. Il UI progetto contiene:

    • Classe Windows Form denominata ModelViewControl.

    • File denominato DataBinding.cs che contiene una definizione parziale aggiuntiva di ModelViewControl. 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.

DSL definition

  1. Aprire DslDefinition.dsl nella finestra di progettazione DSL.

  2. Delete ExampleElement

  3. 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.

  4. Usare lo strumento Classe di dominio denominata per creare le classi di dominio seguenti:

    • Field - Assegnare questa proprietà di dominio aggiuntiva denominata Size.

    • 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.

  5. Usare lo strumento Classe di dominio per creare le classi seguenti:

    • Sheep

    • Goat

  6. Usare lo strumento ereditarietà per creare Goat ed Sheep ereditare da Animal.

  7. Usare lo strumento incorporamento per incorporare Field e Animal in Farm.

  8. 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.

  9. Trasformare tutti i modelli nella barra degli strumenti di Esplora soluzioni.

  10. 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

  1. 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.

  2. 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.

    Data sources window

Connessione il modello in un modulo

  1. Nel progetto dell'interfaccia utente eliminare tutti i file con estensione cs esistenti.

  2. Aggiungere un nuovo file di controllo utente denominato FarmControl al progetto dell'interfaccia utente .

  3. Nella finestra Origini dati scegliere Dettagli dal menu a discesa farm.

    Lasciare le impostazioni predefinite per le altre proprietà.

  4. 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.

  5. Eliminare farmBindingNavigator. Questa operazione viene generata automaticamente anche nella FarmControl finestra di progettazione, ma non è utile per questa applicazione.

  6. Usando la casella degli strumenti, creare due istanze di DataGridView e denominarle AnimalGridView e FieldGridView.

    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.

  7. 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 .

  8. Usando la casella degli strumenti, creare due istanze di ModelingBindingSource e denominarle AnimalBinding e FieldBinding.

  9. Impostare la proprietà DataSource di ogni ModelingBindingSource su farmBindingSource.

    Impostare la proprietà DataMember su Animals o Fields.

  10. Impostare le proprietà DataSource di AnimalGridView su AnimalBindinge su FieldGridView FieldBinding.

  11. 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 of the DSL binding

    Schema dei collegamenti tra origini dati e viste.

Completare le associazioni al linguaggio DSL

  1. 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);
        }
      }
    }
    
  2. 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.

  1. Compilare ed eseguire la soluzione.

  2. Nell'istanza sperimentale di Visual Studio aprire il file sample .

  3. 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 .

  4. 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à

  1. Nella visualizzazione progettazione di FarmControl.cs selezionare un campo semplice, ad esempio Nome, Dimensioni o IsOrganic.

  2. 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.

  3. 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

  1. 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.

  2. 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;
    
  3. Aggiungere pulsanti simili per Capre e Campi.

  4. Compilare ed eseguire la soluzione.

  5. 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.

    Sample data grid view

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.