Controladores de los cambios de valor de propiedad de dominio

En un lenguaje específico de Visual Studio , cuando el valor de una propiedad cambia de dominio, OnValueChanging() y los métodos de OnValueChanged() se invocan en el controlador de la propiedad del dominio.Para responder al cambio, puede invalidar estos métodos.

Reemplazar los métodos del controlador de la propiedad

Cada propiedad de dominio del lenguaje específico controla una clase que está anidada dentro de la clase de dominio primario.su nombre sigue el formato PropertyNamePropertyHandler.Puede inspeccionar esta clase de controlador de la propiedad en el archivo Dsl\Generated Code\DomainClasses.cs.En la clase, se llama a OnValueChanging() inmediatamente antes de que se llama a los cambios de valor, y OnValueChanged() inmediatamente después de que los cambios de valor.

Por ejemplo, suponga que tiene una clase de dominio denominada comentario que tiene un dominio propiedad texto denominado una propiedad de entero de la cadena y denominada TextLengthCount.Para hacer TextLengthCount siempre para contener la longitud de la cadena de texto , puede escribir el código siguiente en un archivo independiente en el proyecto de ADSL:

  // Domain Class "Comment":
  public partial class Comment 
  {
    // Domain Property "Text":
    partial class TextPropertyHandler
    {
      protected override void OnValueChanging(CommentBase element, string oldValue, string newValue)
      {
        base.OnValueChanging(element, oldValue, newValue);

        // To update values outside the Store, write code here.

        // Let the transaction manager handle undo:
        Store store = element.Store;
        if (store.InUndoRedoOrRollback || store.InSerializationTransaction) return;

        // Update values in the Store:
        this.TextLengthCount = newValue.Length;
      }
    }
  }

Observe los siguientes sobre los controladores de propiedad:

  • El controlador de la propiedad que se llame a los métodos cuando el usuario realiza cambios en una propiedad de dominio, y cuando el código de programa asigna un valor a la propiedad.

  • Se llama a los métodos sólo cuando cambie el valor realmente.No se invoca el controlador si el código de programa asigna un valor que sea igual al valor actual.

  • Las propiedades calculadas y personalizadas de dominio de almacenamiento no tienen métodos de OnValueChanged y de OnValueChanging.

  • No puede utilizar un controlador de cambio para modificar el nuevo valor.Si desea que, por ejemplo para restringir el valor a un intervalo determinado, define ChangeRule.

  • No puede agregar un controlador de cambio a una propiedad que representa un rol de una relación.En su lugar, defina AddRule y DeleteRule en la clase de la relación.se desencadenan estas reglas cuando se crean o se cambian los vínculos.Para obtener más información, vea Las reglas propagan los cambios dentro del modelo.

Bb126481.collapse_all(es-es,VS.110).gifCambios dentro y fuera del almacén

Los métodos del controlador de la propiedad se denomina dentro de la transacción que inició el cambio.Por consiguiente, puede realizar más cambios en el almacén sin abrir una nueva transacción.Los cambios pueden dar lugar a llamadas adicionales del controlador.

Cuando una transacción se está deshaciendo, rehecha, o revertirse a, no debe realizar cambios en el almacén, es decir, los cambios en los elementos de modelo, relaciones, las formas, los diagramas de conectores, o sus propiedades.

Además, no actualizaría normalmente valores cuando el modelo se carga de archivo.

Los cambios en el modelo deben por consiguiente guardar por una prueba como ésta:

if (!store.InUndoRedoOrRollback 
         && !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes 
}

Por el contrario, si el controlador de la propiedad propaga el cambios fuera del almacén, por ejemplo, un archivo, base de datos, o variables de no-almacén, debe realizar siempre esos cambios para actualizar los valores externos cuando el usuario invoca deshacer o rehacer.

Bb126481.collapse_all(es-es,VS.110).gifCancelar un cambio

Si desea evitar un, puede revertir la transacción actual.Por ejemplo, puede ser conveniente asegurarse que permanece una propiedad dentro de un intervalo determinado.

if (newValue > 10) 
{ store.TransactionManager.CurrentTransaction.Rollback();
  System.Windows.Forms.MessageBox.Show("Value must be less than 10");
} 

Bb126481.collapse_all(es-es,VS.110).giftécnica alternativa: propiedades calculadas

El ejemplo anterior muestra cómo OnValueChanged() se puede utilizar para propagar valores de una propiedad de dominio a otra.cada propiedad tiene su propio valor almacenado.

En su lugar, podría considerar la posibilidad de definir la propiedad derivada como propiedad calculada.En ese caso, no tiene ningún almacenamiento propio, y lo está definiendo se evalúa la función siempre que se necesite su valor.Para obtener más información, vea Propiedades calculadas y de almacenamiento personalizado.

En lugar del ejemplo anterior, podría establecer el campo de Tipo de TextLengthCount para ser calculado en la definición del ADSL.Se proporcionaría dispone del método de obtener para esta propiedad del dominio.el método de obtener devolvería la longitud actual de la cadena de texto .

Sin embargo, una desventaja potencial de propiedades calculadas es que la expresión se evalúa cada vez que el valor se utiliza, que podría mostrar un problema de rendimiento.Además, no hay OnValueChanging() y OnValueChanged() en una propiedad calculada.

Bb126481.collapse_all(es-es,VS.110).giftécnica alternativa: Reglas de cambio

Si define un ChangeRule, se ejecuta al final de una transacción en la que un valor de propiedad cambie.Para obtener más información, vea Las reglas propagan los cambios dentro del modelo.

si varios cambios se realizan en una transacción, el ChangeRule se ejecuta cuando todos se completan.por el contrario, el OnValue…se ejecutan métodos cuando algunos de los cambios no se han realizado.Dependiendo de lo que desea obtener, podría crear un ChangeRule más adecuado.

También puede utilizar un ChangeRule para ajustar el nuevo valor de la propiedad para que no dentro de un intervalo determinado.

Nota de precauciónPrecaución

Si una regla realiza cambios en el contenido del almacén, otros controladores de reglas y propiedades pueden activarse.Si una regla cambia la propiedad que la desencadenó, se llamará de nuevo.Debe asegurarse de que las definiciones de regla no den lugar a desencadenar infinito.

using Microsoft.VisualStudio.Modeling; 
...
// Change rule on the domain class Comment:
[RuleOn(typeof(Comment), FireTime = TimeToFire.TopLevelCommit)] 
class MyCommentTrimRule : ChangeRule
{
  public override void 
    ElementPropertyChanged(ElementPropertyChangedEventArgs e)
  {
    base.ElementPropertyChanged(e);
    Comment comment = e.ModelElement as Comment;
      
    if (comment.Text.StartsWith(" ") || comment.Text.EndsWith(" "))
      comment.Text = comment.Text.Trim();
    // If changed, rule will trigger again.
  }
}

// Register the rule: 
public partial class MyDomainModel 
{
 protected override Type[] GetCustomDomainModelTypes() 
 { return new Type[] { typeof(MyCommentTrimRule) }; 
 }
} 

Ejemplo

Bb126481.collapse_all(es-es,VS.110).gifDescripción

El ejemplo siguiente se reemplaza el controlador de la propiedad de una propiedad de dominio y notifica al usuario cuando una propiedad para la clase de dominio de ExampleElement ha cambiado.

Bb126481.collapse_all(es-es,VS.110).gifCódigo

using DslModeling = global::Microsoft.VisualStudio.Modeling;
using DslDesign = global::Microsoft.VisualStudio.Modeling.Design;

namespace msft.FieldChangeSample
{
  public partial class ExampleElement
  {
    internal sealed partial class NamePropertyHandler
    {
      protected override void OnValueChanged(ExampleElement element,
         string oldValue, string newValue)
      {
        if (!this.Store.InUndoRedoOrRollback)
        {
           // make in-store changes here...
        }
        // This part is called even in undo:
        System.Windows.Forms.MessageBox.Show("Value Has Changed");
        base.OnValueChanged(element, oldValue, newValue);
      }
    }
  }
}

Vea también

Referencia

OnValueChanged

OnValueChanging