Personalizar la creación y el movimiento de los elementosCustomizing Element Creation and Movement

Puede permitir que un elemento se arrastra hasta otro, desde el cuadro de herramientas o en una operación de pegado o mover la operación.You can allow an element to be dragged onto another, either from the toolbox or in a paste or move operation. Puede tener los elementos movidos vinculados a los elementos de destino, el uso de las relaciones que especifique.You can have the moved elements linked to the target elements, using the relationships that you specify.

Una directiva de fusión mediante combinación de elementos (EMD) especifica lo que ocurre cuando un elemento de modelo es combinada en otro elemento de modelo.An element merge directive (EMD) specifies what happens when one model element is merged into another model element. Esto sucede cuando:This happens when:

  • El usuario arrastra desde el cuadro de herramientas hasta el diagrama o una forma.The user drags from the toolbox onto the diagram or a shape.

  • El usuario crea un elemento mediante el uso de un menú Agregar en el explorador o una forma de compartimiento.The user creates an element by using an Add menu in the explorer or a compartment shape.

  • El usuario mueve un elemento de una calle a otra.The user moves an item from one swimlane to another.

  • El usuario pega un elemento.The user pastes an element.

  • El código del programa llama a la directiva de combinación del elemento.Your program code calls the element merge directive.

Aunque pueden parecer las operaciones de creación sea distinto de las operaciones de copia, trabajan realmente en la misma manera.Although the creation operations might seem to be different from the copy operations, they actually work in the same way. Cuando se agrega un elemento, por ejemplo en el cuadro de herramientas, un prototipo de la se replica.When an element is added, for example from the toolbox, a prototype of it is replicated. El prototipo se combina con el modelo en la misma manera que los elementos que se han copiado desde otra parte del modelo.The prototype is merged into the model in the same manner as elements that have been copied from another part of the model.

La responsabilidad de una EMD es decidir cómo se debe combinar un objeto o grupo de objetos en una ubicación determinada en el modelo.The responsibility of an EMD is to decide how an object or group of objects should be merged into a particular location in the model. En concreto, decide qué relaciones deben crearse para vincular el grupo combinado en el modelo.In particular, it decides what relationships should be instantiated to link the merged group into the model. También puede personalizar para establecer las propiedades y para crear objetos adicionales.You can also customize it to set properties and to create additional objects.

DSL-EMD_fusionar mediante combinación

Una EMD se genera automáticamente al definir una relación de incrustación.An EMD is generated automatically when you define an embedding relationship. Este valor predeterminado EMD crea una instancia de la relación cuando los usuarios agreguen nuevas instancias de elemento secundario al elemento primario.This default EMD creates an instance of the relationship when users add new child instances to the parent. Puede modificar estos EMDs de forma predeterminada, por ejemplo agregando código personalizado.You can modify these default EMDs, for example by adding custom code.

También puede agregar sus propios EMDs en la definición de DSL, para permitir que los usuarios arrastrar o pegar diferentes combinaciones de clases de recepción y combinadas.You can also add your own EMDs in the DSL definition, to let users drag or paste different combinations of merged and receiving classes.

Definir una directiva de fusión mediante combinación de elementosDefining an Element Merge Directive

Puede agregar directivas de combinación de elementos a las clases de dominio, relaciones de dominio, formas, conectores y diagramas.You can add element merge directives to domain classes, domain relationships, shapes, connectors, and diagrams. Puede agregar o encontrarlas en el Explorador de DSL en la clase de dominio receptora.You can add or find them in DSL Explorer under the receiving domain class. La clase receptora es la clase de dominio del elemento que ya está en el modelo y en la que se van a combinar el elemento nuevo o copiar.The receiving class is the domain class of the element that is already in the model, and onto which the new or copied element will be merged.

DSL-EMD_detalles

El indización clase es la clase de dominio de los elementos que se pueden mezclar con los miembros de la clase receptora.The Indexing Class is the domain class of elements that can be merged into members of the receiving class. Las instancias de subclases de la clase de indización se combinarán también por esta EMD, a menos que establezca se aplica a las subclases en False.Instances of subclasses of the Indexing Class will also be merged by this EMD, unless you set Applies to subclasses to False.

Hay dos tipos de directiva de combinación:There are two kinds of merge directive:

  • Un proceso de mezcla directiva especifica las relaciones que se debe vincular el nuevo elemento en el árbol.A Process Merge directive specifies the relationships by which the new element should be linked into the tree.

  • Un reenviar mezcla directiva redirige el nuevo elemento a otro elemento de recepción, normalmente un elemento primario.A Forward Merge directive redirects the new element to another receiving element, typically a parent.

Puede agregar código personalizado para combinar las directivas:You can add custom code to merge directives:

  • Establecer aceptación personalizada usa para agregar su propio código para determinar si una instancia determinada del elemento de Index Server se debe combinar en el elemento de destino.Set Uses custom accept to add your own code to determine whether a particular instance of the indexing element should be merged into the target element. Cuando el usuario arrastra desde el cuadro de herramientas, se muestra el puntero "no válido" si el código no permite la combinación.When the user drags from the toolbox, the "invalid" pointer shows if your code disallows the merge.

    Por ejemplo, podría permitir la fusión mediante combinación solo cuando el elemento receptor está en un estado determinado.For example, you could allow the merge only when the receiving element is in a particular state.

  • Establecer combinación personalizada usa para agregar proporcionan el propio código para definir los cambios realizados en el modelo cuando se realiza la combinación.Set Uses custom merge to add provide own code to define the changes that are made to the model when the merge is performed.

    Por ejemplo, podría establecer propiedades en el elemento combinado mediante el uso de datos desde su nueva ubicación en el modelo.For example, you could set properties in the merged element by using data from its new location in the model.

Note

Si escribe código personalizado de mezcla, afecta sola combinaciones que se realizan mediante el uso de este EMD.If you write custom merge code, it affects only merges that are performed by using this EMD. Si hay otros EMDs que combinación el mismo tipo de objeto, o si hay otro código personalizado que crea estos objetos sin utilizar el EMD, a continuación, no afectará el código personalizado de mezcla.If there are other EMDs that merge the same type of object, or if there is other custom code that creates these objects without using the EMD, then they will not be affected by your custom merge code.

Si desea asegurarse de que un nuevo elemento o una nueva relación siempre se procesa el código personalizado, considere la posibilidad de definir un AddRule en la relación de incrustación y un DeleteRule en la clase de dominio del elemento.If you want to make sure that a new element or new relationship is always processed by your custom code, consider defining an AddRule on the embedding relationship and a DeleteRule on the element's domain class. Para obtener más información, consulte propagar cambios en el modelo de reglas de.For more information, see Rules Propagate Changes Within the Model.

Ejemplo: Definir una EMD sin código personalizadoExample: Defining an EMD without custom code

En el siguiente ejemplo permite a los usuarios crear un elemento y un conector al mismo tiempo, arrastre desde el cuadro de herramientas a una forma existente.The following example lets users create an element and a connector at the same time by dragging from the toolbox onto an existing shape. El ejemplo agrega una EMD a la definición de DSL.The example adds an EMD to the DSL Definition. Antes de esta modificación, los usuarios pueden arrastrar herramientas al diagrama, pero no en formas existentes.Before this modification, users can drag tools onto the diagram, but not onto existing shapes.

Los usuarios también pueden pegar elementos en otros elementos.Users can also paste elements onto other elements.

Para permitir que los usuarios crear un elemento y un conector al mismo tiempoTo let users create an element and a connector at the same time

  1. Crear un DSL nuevo mediante el lenguaje mínimo plantilla de solución.Create a new DSL by using the Minimal Language solution template.

    Al ejecutar este DSL, le permite crear formas y conectores entre las formas.When you run this DSL, it lets you create shapes and connectors between the shapes. No se puede arrastrar una nueva ExampleElement forma desde el cuadro de herramientas a una forma existente.You cannot drag a new ExampleElement shape from the toolbox onto an existing shape.

  2. Para permitir que los usuarios combinar elementos en ExampleElement formas, crear un nuevo EMD en el ExampleElement la clase de dominio:To let users merge elements onto ExampleElement shapes, create a new EMD in the ExampleElement domain class:

    1. En DSL Explorer, expanda clases de dominio.In DSL Explorer, expand Domain Classes. Haga clic en ExampleElement y, a continuación, haga clic en Agregar directiva de fusión de nuevo elemento.Right-click ExampleElement and then click Add New Element Merge Directive.

    2. Asegúrese de que el detalles de DSL ventana está abierta, para que puedan ver los detalles de la nueva EMD.Make sure that the DSL Details window is open, so that you can see the details of the new EMD. (Menú: vista, otros Windows, detalles de DSL.)(Menu: View, Other Windows, DSL Details.)

  3. Establecer el clase de indexación en la ventana Detalles de DSL, para definir qué clase de elementos se puede combinar en ExampleElement objetos.Set the Indexing class in the DSL Details window, to define what class of elements can be merged onto ExampleElement objects.

    En este ejemplo, seleccione ExampleElements, de modo que el usuario puede arrastrar elementos nuevos a los elementos existentes.For this example, select ExampleElements, so that the user can drag new elements onto existing elements.

    Tenga en cuenta que la clase de indización se convierte en el nombre de la EMD en el Explorador de DSL.Notice that the Indexing class becomes the name of the EMD in DSL Explorer.

  4. En mezcla de proceso mediante la creación de vínculos, agregue dos rutas de acceso:Under Process merge by creating links, add two paths:

    • Una ruta de acceso vincula el nuevo elemento con el modelo primario.One path links the new element to the parent model. La expresión de ruta de acceso que tiene que introducir navega desde el elemento existente, seguridad a través de la relación de incrustación para el modelo primario.The path expression that you need to enter navigates from the existing element, up through the embedding relationship to the parent model. Por último, especifica el rol en el nuevo vínculo a la que se asignará el nuevo elemento.Finally, it specifies the role in the new link to which the new element will be assigned. La ruta de acceso es como sigue:The path is as follows:

      ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements

    • La ruta de acceso de otro vincula el nuevo elemento a elemento existente.The other path links the new element to the existing element. La expresión de ruta de acceso especifica la relación de referencia y el rol al que se le asignará el nuevo elemento.The path expression specifies the reference relationship and the role to which the new element will be assigned. Esta ruta de acceso es como sigue:This path is as follows:

      ExampleElementReferencesTargets.Sources

      Puede usar la herramienta de exploración de la ruta de acceso para crear cada ruta de acceso:You can use the path navigation tool to create each path:

      1. En mezcla de proceso mediante la creación de vínculos en rutas de acceso, haga clic en <Agregar ruta de acceso >.Under Process merge by creating links at paths, click <add path>.

      2. Haga clic en la flecha desplegable a la derecha del elemento de lista.Click the drop-down arrow to the right of the list item. Aparece una vista de árbol.A tree view appears.

      3. Expanda los nodos de árbol para formar la ruta de acceso que desee especificar.Expand the nodes in the tree to form the path that you want to specify.

  5. Probar el DSL:Test the DSL:

    1. Presione F5 para volver a generar y ejecutar la solución.Press F5 to rebuild and run the solution.

      Volver a generar tardará más tiempo del habitual porque se actualizará el código generado desde plantillas de texto para ajustarse a la nueva definición de DSL.Rebuilding will take longer than usual because the generated code will be updated from text templates to conform to the new DSL Definition.

    2. Cuando se ha iniciado la instancia experimental de Visual Studio, abra un archivo de modelo de su DSL.When the experimental instance of Visual Studio has started, open a model file of your DSL. Cree algunos elementos de ejemplo.Create some example elements.

    3. Arrastre desde el ejemplo elemento herramienta en una forma existente.Drag from the Example Element tool onto an existing shape.

      Aparece una forma nueva y esté vinculado a la forma con un conector existente.A new shape appears, and it is linked to the existing shape with a connector.

    4. Copie una forma existente.Copy an existing shape. Seleccione otra forma y pegar.Select another shape and paste.

      Se crea una copia de la primera forma.A copy of the first shape is created. Tiene un nombre nuevo y esté vinculado a la segunda forma con un conector.It has a new name and it is linked to the second shape with a connector.

Tenga en cuenta los siguientes puntos de este procedimiento:Notice the following points from this procedure:

  • Mediante la creación de directivas de combinación de elementos, puede permitir que cualquier clase de elemento para aceptar cualquier otro.By creating Element Merge Directives, you can allow any class of element to accept any other. Se crea el EMD en la clase de dominio receptora, y se especifica la clase de dominio aceptado en el Index (clase) campo.The EMD is created in the receiving domain class, and the accepted domain class is specified in the Index class field.

  • Al definir las rutas de acceso, puede especificar los vínculos que deben usarse para conectar el nuevo elemento con el modelo existente.By defining paths, you can specify what links should be used to connect the new element to the existing model.

    Los vínculos que especifique deben incluir una relación de incrustación.The links that you specify should include one embedding relationship.

  • El EMD afecta a ambas creación desde el cuadro de herramientas y también las operaciones de pegar.The EMD affects both creation from the toolbox and also paste operations.

    Si escribe código personalizado que crea nuevos elementos, puede invocar explícitamente el EMD utilizando el ElementOperations.Merge método.If you write custom code that creates new elements, you can explicitly invoke the EMD by using the ElementOperations.Merge method. Esto garantiza que el código vincula nuevos elementos en el modelo en la misma manera que otras operaciones.This makes sure that your code links new elements into the model in the same way as other operations. Para obtener más información, consulte personalizar el comportamiento de copia.For more information, see Customizing Copy Behavior.

Ejemplo: Agregar código de aceptación personalizada a una EMDExample: Adding Custom Accept code to an EMD

Al agregar código personalizado a una EMD, puede definir el comportamiento de combinación más compleja.By adding custom code to an EMD, you can define more complex merge behavior. Este sencillo ejemplo impide que el usuario agregando más de un número fijo de elementos al diagrama.This simple example prevents the user from adding more than a fixed number of elements to the diagram. En el ejemplo se modifica el valor predeterminado EMD que acompaña a una relación de incrustación.The example modifies the default EMD that accompanies an embedding relationship.

Escribir código de aceptación personalizada para restringir lo que puede agregar el usuarioTo write Custom Accept code to restrict what the user can add

  1. Crear un DSL con la lenguaje mínimo plantilla de solución.Create a DSL by using the Minimal Language solution template. Abra el diagrama de definición de DSL.Open the DSL Definition diagram.

  2. En el Explorador de DSL, expanda clases de dominio, ExampleModel, directivas de combinación de elementos.In DSL Explorer, expand Domain Classes, ExampleModel, Element Merge Directives. Seleccione la directiva de combinación del elemento que se denomina ExampleElement.Select the element merge directive that is named ExampleElement.

    Este EMD controla cómo el usuario puede crear nuevos ExampleElement objetos en el modelo, por ejemplo, arrastre desde el cuadro de herramientas.This EMD controls how the user can create new ExampleElement objects in the model, for example by dragging from the toolbox.

  3. En el detalles de DSL ventana, seleccione aceptación personalizada usa.In the DSL Details window, select Uses custom accept.

  4. Recompilar la solución.Rebuild the solution. Esto tardará más tiempo del habitual porque el código generado se actualizará desde el modelo.This will take longer than usual because the generated code will be updated from the model.

    Un error de compilación será notificado, al igual que: "Company.ElementMergeSample.ExampleElement no contiene una definición para CanMergeExampleElement..."A build error will be reported, similar to: "Company.ElementMergeSample.ExampleElement does not contain a definition for CanMergeExampleElement..."

    Debe implementar el método CanMergeExampleElement.You must implement the method CanMergeExampleElement.

  5. Cree un nuevo archivo de código en el Dsl proyecto.Create a new code file in the Dsl project. Reemplace su contenido por el código siguiente y cambiar el espacio de nombres al espacio de nombres del proyecto.Replace its content with the following code and change the namespace to the namespace of your project.

    using Microsoft.VisualStudio.Modeling;
    
    namespace Company.ElementMergeSample // EDIT.
    {
      partial class ExampleModel
      {
        /// <summary>
        /// Called whenever an ExampleElement is to be merged into this ExampleModel.
        /// This happens when the user pastes an ExampleElement
        /// or drags from the toolbox.
        /// Determines whether the merge is allowed.
        /// </summary>
        /// <param name="rootElement">The root element in the merging EGP.</param>
        /// <param name="elementGroupPrototype">The EGP that the user wants to merge.</param>
        /// <returns>True if the merge is allowed</returns>
        private bool CanMergeExampleElement(ProtoElementBase rootElement, ElementGroupPrototype elementGroupPrototype)
        {
          // Allow no more than 4 elements to be added:
          return this.Elements.Count < 4;
        }
      }
    }
    

    Este sencillo ejemplo restringe el número de elementos que se pueden combinar en el modelo primario.This simple example restricts the number of elements that can be merged into the parent model. Para condiciones más interesantes, puede inspeccionar el método cualquiera de las propiedades y los vínculos del objeto receptor.For more interesting conditions, the method can inspect any of the properties and links of the receiving object. También puede inspeccionar las propiedades de los elementos de combinación, que se realizan en un ElementGroupPrototype.It can also inspect the properties of the merging elements, which are carried in a ElementGroupPrototype. Para obtener más información acerca de ElementGroupPrototypes, consulte personalizar el comportamiento de copia.For more information about ElementGroupPrototypes, see Customizing Copy Behavior. Para obtener más información sobre cómo escribir código que lee un modelo, vea navegar y actualizar un modelo en el código de programa.For more information about how to write code that reads a model, see Navigating and Updating a Model in Program Code.

  6. Probar el DSL:Test the DSL:

    1. Presione F5 para recompilar la solución.Press F5 to rebuild the solution. Cuando se abre la instancia experimental de Visual Studio, abra una instancia de su DSL.When the experimental instance of Visual Studio opens, open an instance of your DSL.

    2. Crear nuevos elementos de varias maneras:Create new elements in several ways:

      • Arrastre desde el ejemplo elemento herramienta al diagrama.Drag from the Example Element tool onto the diagram.

      • En el Explorador de modelos de ejemplo, haga clic en el nodo raíz y, a continuación, haga clic en Agregar nuevo elemento de ejemplo.In the Example Model Explorer, right-click the root node and then click Add New Example Element.

      • Copiar y pegar un elemento en el diagrama.Copy and paste an element on the diagram.

    3. Compruebe que no se puede usar cualquiera de estas formas de agregar más de cuatro elementos al modelo.Verify that you cannot use any of these ways to add more than four elements to the model. Esto es porque todos usan la directiva de fusión de elemento.This is because they all use the Element Merge Directive.

Ejemplo: Agregar código personalizado de mezcla para una EMDExample: Adding Custom Merge code to an EMD

En el código de combinación personalizada, puede definir lo que sucede cuando el usuario arrastra una herramienta o pega en un elemento.In custom merge code, you can define what happens when the user drags a tool or pastes onto an element. Hay dos maneras de definir una combinación personalizada:There are two ways to define a custom merge:

  1. Establecer usa mezcla personalizada y proporcionar el código necesario.Set Uses Custom Merge and supply the required code. El código reemplaza el código generado de mezcla.Your code replaces the generated merge code. Use esta opción si desea redefinir completamente lo que hace la combinación.Use this option if you want to completely redefine what the merge does.

  2. Invalidar el MergeRelate método y opcionalmente el MergeDisconnect método.Override the MergeRelate method, and optionally the MergeDisconnect method. Para ello, debe establecer el genera doble derivada propiedad de la clase de dominio.To do this, you must set the Generates Double Derived property of the domain class. El código puede llamar el código generado de mezcla en la clase base.Your code can call the generated merge code in the base class. Use esta opción si desea realizar operaciones adicionales después de haber realizado la fusión mediante combinación.Use this option if you want to perform additional operations after the merge has been performed.

    Estos métodos sólo afectan a las combinaciones que se realizan mediante el uso de este EMD.These approaches only affect merges that are performed by using this EMD. Si desea que afecte a todas las formas en que se puede crear el elemento combinado, una alternativa consiste en definir un AddRule en la relación de incrustación y un DeleteRule en la clase de dominio combinada.If you want to affect all ways in which the merged element can be created, an alternative is to define an AddRule on the embedding relationship and a DeleteRule on the merged domain class. Para obtener más información, consulte propagar cambios en el modelo de reglas de.For more information, see Rules Propagate Changes Within the Model.

Para invalidar MergeRelateTo override MergeRelate

  1. En la definición de DSL, asegúrese de que ha definido el EMD a la que desea agregar el código.In the DSL definition, make sure that you have defined the EMD to which you want to add code. Si lo desea, puede agregar rutas de acceso y definir código de aceptación personalizada tal como se describe en las secciones anteriores.If you want, you can add paths and define custom accept code as described in the previous sections.

  2. En el diagrama DslDefinition, seleccione la clase receptora de la combinación.In the DslDefinition diagram, select the receiving class of the merge. Normalmente es la clase en el extremo de origen de una relación de incrustación.Typically it is the class at the source end of an embedding relationship.

    Por ejemplo, en un DSL generado a partir de la solución de lenguaje mínimo, seleccione ExampleModel.For example, in a DSL generated from the Minimal Language solution, select ExampleModel.

  3. En el propiedades ventana, establezca genera doble derivada a true.In the Properties window, set Generates Double Derived to true.

  4. Recompilar la solución.Rebuild the solution.

  5. Inspeccionar el contenido de Dsl\Generated Files\DomainClasses.cs.Inspect the content of Dsl\Generated Files\DomainClasses.cs. Buscar métodos denominados MergeRelate y examinar su contenido.Search for methods named MergeRelate and examine their contents. Esto ayudará a escribir sus propias versiones.This will help you write your own versions.

  6. En un nuevo archivo de código, escribir una clase parcial para la clase receptora y reemplazar el MergeRelate método.In a new code file, write a partial class for the receiving class, and override the MergeRelate method. No se olvide de llamar al método base.Remember to call the base method. Por ejemplo:For example:

    partial class ExampleModel
    {
      /// <summary>
      /// Called when the user drags or pastes an ExampleElement onto the diagram.
      /// Sets the time of day as the name.
      /// </summary>
      /// <param name="sourceElement">Element to be added</param>
      /// <param name="elementGroup">Elements to be merged</param>
      protected override void MergeRelate(ModelElement sourceElement, ElementGroup elementGroup)
      {
        // Connect the element according to the EMD:
        base.MergeRelate(sourceElement, elementGroup);
    
        // Custom actions:
        ExampleElement mergingElement = sourceElement as ExampleElement;
        if (mergingElement != null)
        {
          mergingElement.Name = DateTime.Now.ToLongTimeString();
        }
      }
    }
    

Escribir código personalizado de mezclaTo write Custom Merge code

  1. En Dsl\Generated Code\DomainClasses.cs, inspeccionar los métodos denominados MergeRelate.In Dsl\Generated Code\DomainClasses.cs, inspect methods named MergeRelate. Estos métodos crean vínculos entre un elemento nuevo y el modelo existente.These methods create links between a new element and the existing model.

    Asimismo, inspeccione métodos denominados MergeDisconnect.Also, inspect methods named MergeDisconnect. Estos métodos desvinculación un elemento del modelo cuando se va a eliminar.These methods unlink an element from the model when it is to be deleted.

  2. En DSL Explorer, seleccione o cree la directiva de fusión del elemento que desea personalizar.In DSL Explorer, select or create the Element Merge Directive that you want to customize. En el detalles de DSL ventana, establezca usa mezcla personalizada.In the DSL Details window, set Uses Custom Merge.

    Al establecer esta opción, el proceso de mezcla y reenviar mezcla se omiten las opciones.When you set this option, the Process Merge and Forward Merge options are ignored. El código se usa en su lugar.Your code is used instead.

  3. Recompilar la solución.Rebuild the solution. Se tardará más de lo habitual porque se actualizarán los archivos de código generado desde el modelo.It will take longer than usual because the generated code files will be updated from the model.

    Aparecerán mensajes de error.Error messages will appear. Haga doble clic en los mensajes de error para ver las instrucciones que aparecen en el código generado.Double-click the error messages to see the instructions in the generated code. Estas instrucciones le pedirá que suministre los dos métodos, MergeRelate YourDomainClass y MergeDisconnect YourDomainClassThese instructions ask you to supply two methods, MergeRelateYourDomainClass and MergeDisconnectYourDomainClass

  4. Escribir los métodos en una definición de clase parcial en un archivo de código independiente.Write the methods in a partial class definition in a separate code file. Los ejemplos que se ha inspeccionado anteriormente deben sugerir lo que necesita.The examples you inspected earlier should suggest what you need.

    Código de la combinación personalizada no afectará a código que crea los objetos y relaciones directamente y no afectará a otros EMDs.Custom merge code will not affect code that creates objects and relationships directly, and it will not affect other EMDs. Para asegurarse de que se implementen los cambios adicionales, independientemente de cómo se crea el elemento, considere la posibilidad de escribir un AddRule y un DeleteRule en su lugar.To make sure that your additional changes are implemented regardless of how the element is created, consider writing an AddRule and a DeleteRule instead. Para obtener más información, consulte propagar cambios en el modelo de reglas de.For more information, see Rules Propagate Changes Within the Model.

Redirigir a una operación de combinaciónRedirecting a Merge Operation

Una directiva de combinación directa redirige el destino de una operación de combinación.A forward merge directive redirects the target of a merge operation. Normalmente, el nuevo destino es el primario de incrustación del destino inicial.Typically, the new target is the embedding parent of the initial target.

Por ejemplo, en un DSL que se creó con la plantilla de diagrama de componentes, los puertos se incrustan en los componentes.For example, in a DSL that was created with the component diagram template, Ports are embedded in Components. Los puertos se muestran como formas pequeñas en el borde de una forma de componente.Ports are displayed as small shapes on the edge of a component shape. El usuario crea puertos, arrastre la herramienta de puerto a una forma de componente.The user creates ports by dragging the Port tool onto a Component shape. Pero en ocasiones, el usuario arrastra erróneamente la herramienta de puerto a un puerto existente, en lugar del componente, y se produce un error en la operación.But sometimes, the user mistakenly drags the Port tool onto an existing port, instead of the component, and the operation fails. Se trata de un error habitual cuando hay varios puertos existentes.This is an easy mistake when there are several existing ports. Para ayudar al usuario para evitar este inconveniente, puede permitir que los puertos que se puedan arrastrar un puerto existente, pero tienen la acción que se redirige al componente primario.To help the user to avoid this nuisance, you can allow ports to be dragged onto an existing port, but have the action redirected to the parent component. La operación funciona como si el elemento de destino fuera del componente.The operation works as if the target element were the component.

Puede crear una directiva de combinación hacia delante en la solución de modelo de componentes.You can create a forward merge directive in the Component Model solution. Si compila y ejecuta la solución original, debería ver que los usuarios pueden arrastrar a cualquier número de puerto de entrada o puerto de salida elementos desde el cuadro de herramientas para un Componente elemento.If you compile and run the original solution, you should see that users can drag any number of Input Port or Output Port elements from the Toolbox to a Component element. Sin embargo, no podrán arrastrar un puerto un puerto existente.However, they cannot drag a port to an existing port. El puntero no se avisa que este cambio no está habilitado.The Unavailable pointer alerts them that this move is not enabled. Sin embargo, puede crear una directiva de combinación directa para que un puerto que esté involuntariamente pasados a una existente puerto de entrada se reenvía a la componente elemento.However, you can create a forward merge directive so that a port that is unintentionally dropped on an existing Input Port is forwarded to the Component element.

Para crear una directiva de combinación directaTo create a forward merge directive

  1. Crear un Domain-Specific Language ToolsDomain-Specific Language Tools solución mediante la plantilla de modelo de componentes.Create a Domain-Specific Language ToolsDomain-Specific Language Tools solution by using the Component Model template.

  2. Mostrar el DSL Explorer , abra DslDefinition.dsl.Display the DSL Explorer by opening DslDefinition.dsl.

  3. En el DSL Explorer, expanda clases de dominio.In the DSL Explorer, expand Domain Classes.

  4. El ComponentPort la clase de dominio abstracta es la clase base de ambos InPort y OutPort.The ComponentPort abstract domain class is the base class of both InPort and OutPort. Haga clic en ComponentPort y, a continuación, haga clic en Agregar directiva de fusión de nuevo elemento.Right-click ComponentPort and then click Add New Element Merge Directive.

    Un nuevo directiva de fusión de elemento nodo aparece en el directivas de combinación de elementos nodo.A new Element Merge Directive node appears under the Element Merge Directives node.

  5. Seleccione el directiva de fusión de elemento nodo y abra el detalles de DSL ventana.Select the Element Merge Directive node and open the DSL Details window.

  6. En la lista de clase de indización, seleccione ComponentPort.In the Indexing class list, select ComponentPort.

  7. Seleccione reenviar fusión mediante combinación a otra clase de dominio.Select Forward merge to a different domain class.

  8. En la lista de selección de ruta de acceso, expanda ComponentPort, expanda ComponentHasPortsy, a continuación, seleccione componente.In the path selection list, expand ComponentPort, expand ComponentHasPorts, and then select Component.

    La nueva ruta de acceso debe ser similar a ésta:The new path should resemble this one:

    ComponentHasPorts.Component/!ComponentComponentHasPorts.Component/!Component

  9. Guarde la solución y, a continuación, transformar las plantillas, haga clic en el botón situado en la el Explorador de soluciones barra de herramientas.Save the solution, and then transform the templates by clicking the rightmost button on the Solution Explorer toolbar.

  10. Compile y ejecute la solución.Build and run the solution. Aparece una nueva instancia de Visual Studio.A new instance of Visual Studio appears.

  11. En el Explorador de soluciones, abra Sample.mydsl.In Solution Explorer, open Sample.mydsl. El diagrama y el ComponentLanguage herramientas aparecen.The diagram and the ComponentLanguage Toolbox appear.

  12. Arrastre un puerto de entrada desde el cuadro de herramientas a otro puerto de entrada.Drag an Input Port from the Toolbox to another Input Port. A continuación, arrastre un OutputPort a un InputPort y, a continuación, a otro OutputPort.Next, drag an OutputPort to an InputPort and then to another OutputPort.

    No debería ver el puntero no está disponible, y debe ser capaz de colocar el nuevo puerto de entrada en uno existente.You should not see the Unavailable pointer, and you should be able to drop the new Input Port on the existing one. Seleccione la nueva puerto de entrada y arrastrarlo a otro punto de la componente.Select the new Input Port and drag it to another point on the Component.

Vea tambiénSee Also