Condividi tramite


Gestori di modifica del valore delle proprietà del dominio

In Visual Studio linguaggio specifico di dominio, quando il valore di una proprietà del dominio, OnValueChanging() e OnValueChanged() i metodi vengono richiamati nel gestore della proprietà del dominio.Per rispondere alla modifica, è possibile eseguire l'override di questi metodi.

Eseguire l'override dei metodi del gestore della proprietà

Ogni proprietà del dominio del linguaggio specifico di dominio viene gestita da una classe annidata nella classe di dominio padre.Il nome al formato NomeproprietàPropertyHandler.È possibile controllare la classe del gestore della proprietà nel file Dsl\Generated Code\DomainClasses.cs.Nella classe, OnValueChanging() viene chiamato immediatamente prima delle modifiche dei valori e OnValueChanged() viene chiamato immediatamente dopo il valore.

Ad esempio, si supponga di disporre di una classe di dominio commento che dispone di una proprietà del dominio stringa denominata testo e una proprietà denominata Integer TextLengthCount.Per indurre TextLengthCount per contenere sempre lunghezza di l testo stringa, è possibile scrivere il codice che segue in un file separato nel progetto di Dsl:

  // 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;
      }
    }
  }

Tenere presenti le informazioni seguenti sui gestori della proprietà:

  • Il gestore delle proprietà i metodi vengono chiamati sia quando l'utente apporta modifiche a una proprietà di dominio che quando codice programma assegna un valore diverso alla proprietà.

  • I metodi vengono chiamati solo quando le modifiche al valore effettivamente.Il gestore non viene chiamato se il codice programma assegna un valore che corrisponde al valore corrente.

  • Le proprietà sono uguali e personalizzate del dominio di archiviazione non hanno metodi di OnValueChanging e di OnValueChanged.

  • Non è possibile utilizzare un gestore di modificare per modificare il nuovo valore.Se si desidera tale scopo, ad esempio per limitare il valore in un determinato intervallo, definito un oggetto ChangeRule.

  • Non è possibile aggiungere un gestore di modifica a una proprietà che rappresenta un ruolo di una relazione.Al contrario, definire AddRule e DeleteRule nella classe di relazioni.Queste regole vengono attivate quando i collegamenti vengono creati o modificati.Per ulteriori informazioni, vedere Le regole propagano le modifiche all'interno del modello.

Bb126481.collapse_all(it-it,VS.110).gifModifiche all'archivio

I metodi del gestore delle proprietà vengono chiamati nella transazione che ha avviato la modifica.Di conseguenza, è possibile apportare ulteriori modifiche nell'archivio senza aprire una nuova transazione.Le modifiche possono comportare le chiamate aggiuntive del gestore.

Quando una transazione è null, ripetere, o è rotolanda indietro, non è necessario apportare le modifiche nell'archivio, ovvero, agli elementi del modello, le relazioni, le forme, ai diagrammi dei connettori, o alle relative proprietà.

Inoltre, in genere non aggiornereste i valori quando il modello viene caricato dal file.

Le modifiche al modello devono pertanto essere custodette da un test come illustrato di seguito:

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

Al contrario, se il gestore della proprietà propaga le modifiche all'esterno dell'archivio, ad esempio, in un file, database, o variabili non archivio, sarà necessario fare sempre le modifiche in modo da aggiornare i valori esterni quando i l'utente richiama il comando annulla o si ripetono.

Bb126481.collapse_all(it-it,VS.110).gifPer annullare una modifica

Per impedire una modifica, è possibile eseguire il rollback della transazione corrente.Ad esempio, è opportuno verificare che una proprietà rimanesse all'interno di un intervallo specifico.

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

Bb126481.collapse_all(it-it,VS.110).giftecnica alternativa: proprietà calcolate

Nell'esempio precedente come OnValueChanged() può essere utilizzato per propagare i valori da una proprietà di dominio a un altro.Ogni proprietà dispone di un proprio valore memorizzato.

Invece, è opportuno definire la proprietà derivata come proprietà calcolata.In tal caso, la proprietà non ha un'archiviazione specifici e consiste nel definire la funzione viene valutata ogni volta che il valore è obbligatorio.Per ulteriori informazioni, vedere Proprietà di archiviazione calcolate e personalizzate.

Invece dell'esempio precedente, è possibile impostare tipo campo di TextLengthCount per essere calcolato nella definizione di modello DSL.Fornito diventi proprietaria ottenere metodo della proprietà del dominio.ottenere il metodo restituisce la lunghezza del testo stringa.

Tuttavia, uno svantaggio potenziale delle proprietà calcolate è che l'espressione viene valutata ogni volta che il valore viene utilizzata, che potrebbe presentare un problema di prestazioni.Inoltre, non vi è OnValueChanging() e OnValueChanged() su una proprietà calcolata.

Bb126481.collapse_all(it-it,VS.110).giftecnica alternativa: Regole di modifica

Se si definisce un ChangeRule, viene eseguito al termine di una transazione nella quale viene modificato il valore di una proprietà.Per ulteriori informazioni, vedere Le regole propagano le modifiche all'interno del modello.

Se alcune modifiche vengono apportate in una transazione, il ChangeRule viene eseguito quando sono tutte complete.Al contrario, il OnValue…i metodi vengono eseguiti quando alcune modifiche non sono state eseguite.Secondo cui si desidera ottenere, questo può rendere un ChangeRule più appropriati.

È anche possibile utilizzare un ChangeRule per regolare il nuovo valore della proprietà per continuare all'interno di un intervallo specifico.

Nota di avvisoAttenzione

Se una regola apportare le modifiche al contenuto dell'archivio, altri gestori delle proprietà e di regole possono essere attivati.Se una regola modifica la proprietà che ha attivato, verrà chiamato nuovamente.È necessario assicurarsi che le definizioni di regola non provochino l'attivazione senza fine.

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) }; 
 }
} 

Esempio

Bb126481.collapse_all(it-it,VS.110).gifDescrizione

Nell'esempio seguente viene eseguito l'override del gestore della proprietà di una proprietà del dominio e all'utente quando una proprietà di ExampleElement la classe di dominio è stato modificato.

Bb126481.collapse_all(it-it,VS.110).gifCodice

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);
      }
    }
  }
}

Vedere anche

Riferimenti

OnValueChanged

OnValueChanging