Sdílet prostřednictvím


Obslužná rutina změny hodnoty vlastnosti domény

V Visual Studio specifické pro doménu jazyce, při změně hodnoty vlastnosti domény, OnValueChanging() a OnValueChanged() metody jsou vyvolány v obslužné rutině vlastnost domény.Reaguje na změnu, lze přepsat tyto metody.

Přepsání metody popisovač vlastnosti

Každou vlastnost domény specifické pro doménu jazyka je zpracováván třídu, která je vnořena v jeho domény nadřazené třídy.Následuje jeho název ve formátu PropertyNamePropertyHandler.Si můžete prohlédnout třídu obslužné rutiny pro tuto vlastnost v souboru Dsl\Generated Code\DomainClasses.cs.Ve třídě OnValueChanging() je volána bezprostředně před změny hodnot a OnValueChanged() je volána bezprostředně po změně hodnoty.

Předpokládejme, máte třídu domény s názvem komentář má vlastnost domény řetězec s názvem Text a ve vlastnosti integer s názvem TextLengthCount.Způsobit TextLengthCount vždy tak, aby obsahovala délka Text řetězce, můžete napsat následující kód v samostatném souboru v projektu 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;
      }
    }
  }

Všimněte si následující body o vlastnost obslužných rutin:

  • Obslužná rutina metody vlastnosti se nazývají uživatel provede změny vlastnost domény, i při programový kód přiřadí jinou hodnotu vlastnosti.

  • Metody jsou volány pouze v případě, že skutečně změní hodnotu.Obslužná rutina není vyvolána, pokud kód program přiřadí hodnotu, která se rovná aktuální hodnotu.

  • Vlastnosti domény počítané a vlastní úložiště nemají OnValueChanged a OnValueChanging metody.

  • Obslužná rutina změnu nelze použít ke změně novou hodnotu.Pokud chcete, aby například chcete-li hodnota omezit na určitý rozsah, definovat ChangeRule.

  • Nelze přidat obslužnou rutinu změnit vlastnosti, která představuje roli v relaci.Místo toho definovat AddRule a DeleteRule na třídu relace.Tato pravidla jsou aktivovány při vytváření nebo změnit odkazy.Další informace naleznete v tématu Pravidla šířící změny v modelu.

Změny z úložiště.

Vlastnost obslužná rutina metody jsou volány v rámci transakce, který inicioval změnu.Proto můžete provést další změny v úložišti bez nutnosti otevírat novou transakci.Vaše změny může být výsledkem volání další obsluhy.

Pokud je vrací zpět transakcí, znovu, nebo vrátit zpět, neprovádějte změny v úložišti, který je se změní na prvky modelu, vztahy, tvary, diagramy konektory nebo jejich vlastnosti.

Kromě toho můžete by obvykle hodnoty při aktualizaci modelu se načítá ze souboru.

Změny modelu by měl být chráněn proto testem nějak takto:

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

Naopak pokud vaše obslužná rutina vlastnost šíří změny mimo úložiště, například na soubor, databáze nebo jiné úložiště proměnné, pak si vždy proveďte tyto změny tak, aby externí hodnoty jsou aktualizovány, když uživatel vyvolá zpět nebo znovu.

Zrušení změn

Pokud chcete, aby se zabránilo změn, můžete se vrátit zpět aktuální transakce.Můžete například chtít zajistit, aby zůstal vlastnost do určitého rozsahu.

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

Alternativní technika: vypočítána vlastnosti

Předchozí příklad ukazuje, jak lze pomocí OnValueChanged() šířit hodnoty z jedné domény vlastnosti do jiného.Každá vlastnost má svou vlastní uložené hodnoty.

Místo toho zvažte definování odvozené vlastnost jako vlastnost vypočtené.V tom případě vlastnost nemá žádné úložiště a definuje funkce vyhodnocena vždy, když její hodnota je povinný.Další informace naleznete v tématu Vypočtené a vlastní vlastnosti úložiště.

Místo v předchozím příkladu jste mohli nastavit druhu pole TextLengthCount být vypočtené v definici DSL.By poskytnout vlastní získat metody pro tuto vlastnost domény.Získat metoda vrátí aktuální délka Text řetězec.

Možnou nevýhodou počítané vlastnosti je však, že tento výraz je vyhodnocován pokaždé, když je použita hodnota, která může představovat problémy s výkonem.Navíc neexistuje žádné OnValueChanging() a OnValueChanged() u počítaných vlastnosti.

Alternativní technika: změnit pravidla

Pokud definujete ChangeRule, je provést na konci transakce, ve kterém se změní hodnotu vlastnosti.Další informace naleznete v tématu Pravidla šířící změny v modelu.

Je-li několik změn v rámci jedné transakce ChangeRule provede, když jsou všechny dokončené.Naopak OnValue...metody jsou spouštěny, když některé změny nebyly provedeny.V závislosti na tom, co chcete dosáhnout, to by mohlo způsobit ChangeRule vhodnější.

Můžete také ChangeRule Chcete-li upravit hodnotu vlastnosti nové udržet do určitého rozsahu.

Poznámka k upozorněníUpozornění

Pravidlo provede změny v úložišti obsahu, může být spuštěna další pravidla a vlastnosti obslužné rutiny.Pokud pravidlo změní vlastnost, která je aktivována, bude volána znovu.Ujistěte se, že vaše pravidlo definice nevedou k publikaci aktivován.

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

Příklad

Popis

Následující příklad přepíše obslužnou rutinu vlastnost domény vlastnosti a upozorní uživatele při vlastnost pro ExampleElement třídy domény byl změněn.

Kód

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

Viz také

Referenční dokumentace

OnValueChanged

OnValueChanging