Crear lenguajes específicos de dominio basados en Windows Forms
Puede utilizar formularios Windows Forms para mostrar el estado de un modelo dominio- específico de (DSL) de lenguaje, en lugar de utilizar un diagrama ADSL. En este tema se explica cómo crear enlazar un Windows form a DSL, mediante la vista Visual Studio y modelado de SDK.
Una instancia ADSL, mostrando una interfaz de usuario de Windows Forms y el explorador de modelos.
El crear formularios Windows Forms ADSL
La plantilla Diseñador mínimo de WinForm ADSL crea ADSL mínimo que se puede modificar para satisfacer dispone de requisitos.
Para crear un WinForms mínimo ADSL
Cree un DSL de la plantilla Diseñador mínimo de WinForm .
En este tutorial, se supone que los nombres siguientes:
Solución y nombre ADSL
FarmApp
Espacio de nombres
Company.FarmApp
Experimente con el ejemplo inicial que la plantilla proporciona:
Transformar todas las plantillas.
Compile y ejecute el ejemplo (CTRL+F5).
En la instancia experimental de Visual Studio, abra el archivo Sample en el proyecto de depuración.
Observe que se muestra en un control de formularios Windows Forms.
También puede ver los elementos de modelo que se muestra en el Explorador.
Agregue algunos elementos del formulario o el Explorador, y observelos que aparecen en la otra pantalla.
En la instancia principal Visual Studio, observe los siguientes sobre la solución de ADSL:
DslDefinition.dsl no contiene ningún elemento del diagrama. Esto es porque no utilizará los diagramas ADSL para ver modelos de la instancia de este ADSL. En su lugar, enlazará un Windows form al modelo, y los elementos del formulario mostrará el modelo.
Además de los proyectos Dsl y DslPackage , la solución contiene un tercer proyecto proyecto denominado UI.UI contiene la definición de un control de formularios Windows Forms. DslPackage depende UI, y UI depende Dsl.
En el proyecto DslPackage , UI\DocView.cs contiene el código que muestra el control de Windows Forms que se define en el proyecto UI .
El proyecto UI contiene un ejemplo que funciona de un control de formulario enlazado a ADSL. Sin embargo, no funcionará cuando se ha cambiado la definición ADSL. El proyecto UI contiene:
Una clase de formulario Windows Forms denominada ModelViewControl.
Un archivo denominado DataBinding.cs que contiene una definición parcial adicional ModelViewControl. Para ver su contenido, en Explorador de soluciones, abra el menú contextual para el archivo y elija Ver código.
Sobre el proyecto de la interfaz de usuario
Al actualizar el archivo de definición ADSL para definir dispone DSL, tendrá que actualizar el control en el proyecto UI de mostrar ADSL. A diferencia de los proyectos Dsl y DslPackage , el proyecto UI de ejemplo no se genera DslDefinitionl.dsl. Puede agregar archivos .tt para generar el código si se desea, aunque esto no se aborda en este tutorial.
Actualizar la definición de DSL
A continuación la definición ADSL se utiliza en este tutorial.
Para actualizar la definición de DSL
DslDefinition.dsl abierto en el diseñador de ADSL.
Suprimir ExampleElement
Cambie el nombre de la clase de dominio ExampleModel a Granja.
Dé establece las propiedades de dominio denominadas TamañoInt32tipo y, a IsOrganicBooleanoescrito.
Nota
Si elimina la clase de dominio raíz y después crear una nueva raíz, tendrá que restablecer la propiedad de clase de la raíz del editor.En Explorador ADSL, seleccione Editor.A continuación en la ventana Propiedades, establezca Clase raíz a Granja.
Utilice la herramienta Nombre denominado Class para crear las siguientes clases de dominio:
Campo – dé a esto una propiedad adicional de dominio denominada Tamaño.
Y – en la ventana Propiedades, establezca Modificador de herencia a Abstracto.
Utilice la herramienta Clase de dominio para crear las clases siguientes:
Ovejas
Cabra
Utilice la herramienta Herencia para que Cabra y Ovejas heredar Y.
Utilice la herramienta La inserción para insertar Campo y Y en Granja.
Podría colocar en orden el diagrama. Para reducir el número de elementos duplicados, utilice el comando Pasar el subárbol aquí en el menú contextual de los elementos de la hoja.
Transformar todas las plantillas en la barra de herramientas del explorador de soluciones.
Compile el proyecto DSL .
Nota
En esta fase, los demás proyectos no se compila sin errores.Sin embargo, deseamos compilar el proyecto de ADSL de modo que el ensamblado esté disponible en el Asistente para orígenes de datos.
Actualizar el proyecto de la interfaz de usuario
Ahora puede crear un nuevo control de usuario que muestran información almacenada en el modelo de ADSL. La manera más fácil de conectar el control de usuario al modelo a través de los enlaces de datos. El adaptador ModelingBindingSource denominado tipo de enlace de datos se ha diseñado específicamente para conectar el dominio (ADSL) a las interfaces no - VMSDK.
Para definir un DSL modelo como origen de datos
En el menú Datos , elija Mostrar orígenes de datos.
Se abre la ventana Orígenes de datos.
Elija Agregar nuevo origen de datos. Se abrirá el Asistente para la configuración de orígenes de datos.
Elija Objeto, Siguiente.
Expanda DSL, Company.FarmApp, y Granjaseleccionado, que es la clase de la raíz del modelo. Elija Finalizar.
En el explorador de soluciones, el proyecto UI ahora contiene Properties\DataSources\Farm.datasource
Las propiedades y relaciones de la clase modelo aparecen en la ventana orígenes de datos.
Para conectar el modelo a un formulario
En el proyecto UI , elimine todos los archivos existentes .cs.
Agregue un nuevo archivo Control de usuario denominado FarmControl al proyecto UI .
En la ventana Orígenes de datos , en el menú desplegable en Granja, elija Detalles.
Deje la configuración predeterminada de las demás propiedades.
Abra FarmControl.cs en la vista diseño.
Arrastre Granja de la ventana orígenes de datos sobre FarmControl.
Un conjunto de controles aparece, uno para cada propiedad. Las propiedades de la relación no representan los controles.
Suprimir farmBindingNavigator. Esto también se genera automáticamente en el diseñador FarmControl , pero no es útil para esta aplicación.
Con el cuadro de herramientas, cree dos instancias DataGridView, y asígneles los nombres AnimalGridView y FieldGridView.
Nota
Un paso alternativo es arrastrar los elementos de Animals y campos de la ventana orígenes de datos sobre el control.Esta acción crea automáticamente las cuadrículas de datos y los enlaces entre la vista de cuadrícula y el origen de datos.Sin embargo, este enlace no funciona correctamente para el dominio (ADSL).Por consiguiente es mejor crear las cuadrículas de datos y los enlaces manualmente.
Si el cuadro de herramientas no contiene la herramienta ModelingBindingSource , agréguela. En el menú contextual de la ficha Datos , elija Elegir elementos. En el cuadro de diálogo Elegir elementos del cuadro de herramientas , seleccione ModelingBindingSourcepestaña de .NET Framework.
Con el cuadro de herramientas, cree dos instancias ModelingBindingSource, y asígneles los nombres AnimalBinding y FieldBinding.
Establezca la propiedad DataSource de cada ModelingBindingSource a farmBindingSource.
Establezca la propiedad DataMember a Animales o a Campos.
Establezca las propiedades DataSourceAnimalGridView a AnimalBinding, y FieldGridView a FieldBinding.
Ajuste el diseño del control de la granja el como.
ModelingBindingSource Es un adaptador que realiza varias funciones específicas del dominio (ADSL):
Ajusta actualizaciones en una transacción del almacén de VMSDK.
Por ejemplo, cuando el usuario elimina una fila de la cuadrícula de la vista de datos, un enlace regular daría lugar a una excepción de la transacción.
Garantiza que, cuando el usuario selecciona una fila, la ventana Propiedades muestra las propiedades del elemento modelo correspondiente, en lugar de la fila de la cuadrícula de datos.
Esquema de vínculos entre los orígenes de datos y las vistas.
Para completar los enlaces a ADSL
Agregue el código siguiente en un archivo de código independiente en el proyecto UI :
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); } } }
En el proyecto DslPackage , edición DslPackage \DocView .tt de actualizar la definición de variable siguiente:
string viewControlTypeName = "FarmControl";
Prueba ADSL
La solución ADSL ahora puede compilar y ejecutar, aunque puede agregar otras mejoras más adelante.
Para probar un ADSL
Compile y ejecute la solución.
En la instancia experimental de Visual Studio, abra el archivo Ejemplo .
En El Explorador de FarmApp, abra el menú contextual del nodo raíz Granja , y elija Agregue la nueva cabra.
Goat1 aparece en la vista Animales .
Advertencia
Debe utilizar el menú contextual del nodo Granja , no el nodo Animales .
Seleccione el nodo raíz Granja y ver sus propiedades.
En el formulario, cambie Nombre o Tamaño de la granja.
Cuando se sale de cada campo en el formulario, los cambios correspondientes de la propiedad en la ventana Propiedades.
Mejorar ADSL
Para que las propiedades actualizan inmediatamente
En la vista de diseño de FarmControl.cs, seleccione un campo simple como name, size o IsOrganic.
En la ventana Propiedades, expanda DataBindings y abra (Avanzada).
En el cuadro de diálogo Formato y enlace de datos avanzado , en Modo de actualización del origen de datos, elija OnPropertyChanged.
Compile y ejecute la solución.
Compruebe que cuando cambia el contenido del campo, la propiedad correspondiente del modelo de la granja cambie inmediatamente.
Para proporcionar agregue botones
En la vista de diseño de FarmControl.cs, utilice el cuadro de herramientas para crear un botón del formulario.
Edite el nombre y el texto del botón, por ejemplo a Nuevas ovejas.
Abra el código subyacente del botón (por ejemplo haciendo doble clic).
Modifíquelo como sigue:
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; } }
También necesitará insertar la siguiente directiva:
using Microsoft.VisualStudio.Modeling;
Agregue botones similares para Goats y campos.
Compile y ejecute la solución.
Compruebe que el nuevo botón agregue un elemento. El nuevo elemento debe aparecer en el Explorador de FarmApp y en la vista adecuada de la cuadrícula de datos.
Debe poder editar el nombre del elemento de vista de la cuadrícula de datos. También puede eliminarla desde allí.
Sobre el código para agregar un elemento
Para los nuevos botones de elemento, el código alternativo siguiente es ligeramente más 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();
}
}
Sin embargo, este código no establece un nombre predeterminado para el nuevo elemento. No se ejecuta ninguna combinación personalizada que haya definido en Directivas de la combinación de elementos ADSL, y no funciona con ningún código personalizado de combinación que pueden haber sido definidas.
Por consiguiente recomendamos utilizar ElementOperations para crear nuevos elementos. Para obtener más información, vea Personalizar la creación y el movimiento de los elementos.
Vea también
Conceptos
Cómo: Definir lenguajes específicos de dominio
Modelar el SDK de Visual Studio - Lenguajes específicos de dominio
Otros recursos
Escribir código para personalizar lenguajes específicos de dominio