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

Puede permitir que un elemento que se pueden arrastrar a otra, en el cuadro de herramientas o en una operación de pegado o la operación de movimiento.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, mediante las relaciones que especifique.You can have the moved elements linked to the target elements, using the relationships that you specify.

Una directiva de mezcla element (EMD) especifica lo que ocurre cuando un elemento de modelo es combinados 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 mezcla de elemento.Your program code calls the element merge directive.

    Aunque las operaciones de creación pueden parecer sea distinto de las operaciones de copia, realmente funcionan de 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 del mismo 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 de la misma manera como 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 un EMD consiste en 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 se deberían crear instancias 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 crear objetos adicionales.You can also customize it to set properties and to create additional objects.

    DSL-EMD_mezcla el rol de una directiva de mezcla de elementoDSL-EMD_Merge The role of an Element Merge Directive

    Un EMD se genera automáticamente cuando se define 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 mediante la adición de 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 DSL, para permitir que los usuarios arrastrar o pegar diferentes combinaciones de clases combinadas y la recepción.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 mezcla de elementoDefining an Element Merge Directive

Puede agregar directivas de mezcla de elemento para 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 buscar 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_DetailsDSL-EMD_Details

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. Instancias de subclases de la clase de Index Server también se combinará por este 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 mezcla:There are two kinds of merge directive:

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

  • A al día mezcla directiva redirige el nuevo elemento a otro elemento de recepción, por lo general, 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 directivas:You can add custom code to merge directives:

  • Establecer Aceptar personalizado usa para agregar su propio código para determinar si se debe combinar una instancia determinada del elemento de Index Server 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, el puntero "no válido" en el que se muestra 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 receptora está en un estado determinado.For example, you could allow the merge only when the receiving element is in a particular state.

  • Establecer mezcla personalizado usa para agregar proporcionar código propio 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, puede establecer propiedades en el elemento combinado mediante datos de 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.

Nota

Si escribe un código de combinación personalizada, afecta solo combinaciones que se realizan usando este EMD.If you write custom merge code, it affects only merges that are performed by using this EMD. Si hay otros EMDs que la combinación del mismo tipo de objeto, o si hay otro código personalizado que crea estos objetos sin utilizar el EMD, a continuación, no se verá afectado por 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 es procesado por 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 los cambios en el modelo de reglas de.For more information, see Rules Propagate Changes Within the Model.

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

En el ejemplo siguiente, se permite a los usuarios crear un elemento y un conector al mismo tiempo, arrastre desde el cuadro de herramientas en 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 un EMD a la definición DSL.The example adds an EMD to the DSL Definition. Antes de esta modificación, los usuarios pueden arrastrar herramientas en el diagrama, pero no en las 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 a 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 nuevo DSL mediante la lenguaje mínimo plantilla de solución.Create a new DSL by using the Minimal Language solution template.

    Cuando se ejecuta este DSL, 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 un nuevo ExampleElement forma del cuadro de herramientas en una forma existente.You cannot drag a new ExampleElement shape from the toolbox onto an existing shape.

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

    1. En DSL explorador, expanda clases de dominio.In DSL Explorer, expand Domain Classes. Haga clic en ExampleElement y, a continuación, haga clic en Agregar nuevo elemento mezcla directiva.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, otras ventanas, detalles de DSL.)(Menu: View, Other Windows, DSL Details.)

  3. Establecer el indización clase en la ventana Detalles de DSL, para definir qué clase de elementos se puede mezclar 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, agregar dos rutas de acceso:Under Process merge by creating links, add two paths:

    1. Una ruta de acceso vincula el elemento nuevo al 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, una 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

    2. La ruta de acceso de otro vincula el nuevo elemento al 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 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:

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

    4. Haga clic en la flecha de lista 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.

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

  5. Probar 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 de lo habitual porque el código generado se actualizarán desde plantillas de texto para que se ajuste a la nueva definición 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 la instancia experimental de Visual StudioVisual Studio ha iniciado, abra un archivo de modelo del ADSL.When the experimental instance of Visual StudioVisual Studio has started, open a model file of your DSL. Crear algunos elementos de ejemplo.Create some example elements.

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

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

    4. Copiar 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 se vincula 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 mezcla de elemento, puede permitir que cualquier clase de elemento que se va a aceptar cualquier otro.By creating Element Merge Directives, you can allow any class of element to accept any other. El EMD se crea 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 utilizarse 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 en 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 mediante 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 de 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 personalizado Aceptar a un EMDExample: Adding Custom Accept code to an EMD

Al agregar código personalizado a un EMD, puede definir el comportamiento de la combinación más complejo.By adding custom code to an EMD, you can define more complex merge behavior. Este sencillo ejemplo impide que el usuario agregar 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.

Para escribir código personalizado acepta y restringir lo que puede agregar el usuarioTo write Custom Accept code to restrict what the user can add

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

  2. En el Explorador de DSL, expanda clases de dominio, ExampleModel, elemento Combinar directivas.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 Aceptar personalizado usa.In the DSL Details window, select Uses custom accept.

  4. Recompilar la solución.Rebuild the solution. Este proceso tardará más de lo 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. Crear un nuevo archivo de código en el Dsl proyecto.Create a new code file in the Dsl project. Reemplazar su contenido con 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 mezclar con el modelo primario.This simple example restricts the number of elements that can be merged into the parent model. Condiciones de más interesante, el método puede inspeccionar 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 pueden 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 de 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 DSL:Test the DSL:

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

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

      1. Arrastre desde el Example (elemento) herramienta en el diagrama.Drag from the Example Element tool onto the diagram.

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

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

    3. Compruebe que no se puede utilizar cualquiera de estos métodos para 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 todas usan la directiva de mezcla de elemento.This is because they all use the Element Merge Directive.

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

En el código de combinación personalizada, puede definir lo que ocurre cuando el usuario arrastra una herramienta o lo 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. Utilice esta opción si desea volver a definir 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 derivados dobles 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. Utilice esta opción si desea realizar operaciones adicionales después de haber realizado la combinación.Use this option if you want to perform additional operations after the merge has been performed.

    Estos enfoques sólo afectan a combinaciones que se realizan usando este EMD.These approaches only affect merges that are performed by using this EMD. Si desea que afecte a todas las formas en el que se puede crear el elemento combinado, una alternativa consiste en definir una 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 los 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 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 personalizado acepta el código 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 de receptor 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ínima, seleccione ExampleModel.For example, in a DSL generated from the Minimal Language solution, select ExampleModel.

  3. En el propiedades ventana, establezca genera derivados dobles 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. Búsqueda de métodos denominados MergeRelate y examinar su contenido.Search for methods named MergeRelate and examine their contents. Esto le 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 de receptor 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 olvide 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 una vez que va a eliminar.These methods unlink an element from the model when it is to be deleted.

  2. En DSL explorador, seleccione o cree la directiva de mezcla de 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.

    Cuando se establece esta opción, el proceso de mezcla y al día mezcla opciones se omiten.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. Tardará más de lo habitual porque los archivos de código generado se actualizará 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 preguntará si quiere proporcionar 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 anteriormente ha inspeccionado deberían proponer lo que necesita.The examples you inspected earlier should suggest what you need.

    Código de combinación personalizada no tendrá ningún efecto código que crea objetos y relaciones directamente y no se verán afectadas otras 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 los cambios adicionales se implementan sin tener en cuenta cómo se crea el elemento, considere la posibilidad de escribir un AddRule y 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 los cambios en el modelo de reglas de.For more information, see Rules Propagate Changes Within the Model.

Redirigir 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. Por lo general, el nuevo destino es el elemento primario de incrustación del destino inicial.Typically, the new target is the embedding parent of the initial target.

Por ejemplo, en DSL que se creó con la plantilla de diagrama de componentes, los puertos se incrustan en componentes.For example, in a DSL that was created with the component diagram template, Ports are embedded in Components. Se muestran los puertos como pequeñas formas 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 si arrastra una forma de componente en la herramienta de puerto.The user creates ports by dragging the Port tool onto a Component shape. A veces, pero 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 esta molesto, puede permitir que los puertos que se pueden arrastrar a 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 mezcla hacia delante en la solución de modelo de componentes.You can create a forward merge directive in the Component Model solution. Si se compila y ejecuta la solución original, debería ver que los usuarios pueden arrastrar cualquier número de puerto de entrada o puerto de salida elementos de la 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 se arrastran un puerto a un puerto existente.However, they cannot drag a port to an existing port. Las alertas de puntero disponible que este movimiento no está habilitados.The Unavailable pointer alerts them that this move is not enabled. Sin embargo, puede crear una directiva de mezcla hacia delante para que un puerto que sea involuntariamente colocadas en 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 mezcla hacia delanteTo 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 la DSL explorador abriendo DslDefinition.dsl.Display the DSL Explorer by opening DslDefinition.dsl.

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

  4. El ComponentPort clase 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 nuevo elemento mezcla directiva.Right-click ComponentPort and then click Add New Element Merge Directive.

    Un nuevo directiva de mezcla de Element nodo aparece en el elemento Combinar directivas nodo.A new Element Merge Directive node appears under the Element Merge Directives node.

  5. Seleccione el directiva de mezcla de Element 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 clases de indización, seleccione ComponentPort.In the Indexing class list, select ComponentPort.

  7. Seleccione reenviar combinar en una clase de dominio diferente.Select Forward merge to a different domain class.

  8. En la lista de selección de la 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 este: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. Una nueva instancia de Visual StudioVisual Studio aparece.A new instance of Visual StudioVisual Studio appears.

  11. En el Explorador de soluciones, abra Sample.mydsl.In Solution Explorer, open Sample.mydsl. En el diagrama y la 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 una InputPort y, a continuación, a otro OutputPort.Next, drag an OutputPort to an InputPort and then to another OutputPort.

    No verá el puntero no está disponible, y debe poder colocar el nuevo puerto de entrada en una 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 arrástrelo hasta otro punto el componente.Select the new Input Port and drag it to another point on the Component.

Vea tambiénSee Also