Domény vlastnost hodnotu změnit obsluhy
V Visual Studio domény specifické pro jazyk, při změně hodnoty vlastnosti domény, OnValueChanging() a OnValueChanged() metody jsou spuštěny v procesu zpracování vlastnosti domény.Chcete-li reagovat na změny, můžete přepsat tyto metody.
Potlačení metody zpracování vlastností
Třída, která je vnořená uvnitř jeho nadřazené třídy domény zpracovává jednotlivé vlastnosti domény domény specifické pro jazyk.Formát názvu PropertyNamePropertyHandler.Můžete kontrolovat této třídy obslužné rutiny vlastnost v souboru Dsl\Generated Code\DomainClasses.cs.Ve třídě OnValueChanging() se nazývá bezprostředně před změny hodnot a OnValueChanged() se nazývá ihned po změně hodnoty.
Předpokládejme například, že máte doménu třídu s názvem Komentář , která má vlastnost domény řetězec s názvem textu a celočíselnou vlastnost s názvem TextLengthCount.Způsobit TextLengthCount vždy k obsahují délku textu řetězec, 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;
}
}
}
Oznámení o vlastnosti obslužné rutiny následující body:
Metody zpracování vlastností jsou volána, když uživatel změní vlastnost domain, i když program kód přiřadí jinou hodnotu vlastnosti.
Metody se nazývají pouze v případě, že skutečně změny hodnoty.Popisovač není vyvolána, pokud program kód přiřadí hodnotu, která se rovná aktuální hodnotu.
Skladování vypočítaná a vlastní vlastnosti domény nemají metody OnValueChanged a OnValueChanging.
Změnit popisovač nelze použít novou hodnotu změnit.Pokud chcete provést, například hodnota omezit na určitou oblast, definovat ChangeRule.
Změnit popisovač nelze přidat vlastnost, která představuje roli vztah.Místo toho definovat AddRule a DeleteRule na vztah třídy.Tato pravidla se spouštějí při odkazy jsou vytvořeny nebo změněny.Další informace naleznete v tématu Pravidla rozšířit změny v rámci modelu.
Změny z úložiště
Vlastnost metody zpracování se nazývají uvnitř transakce, která iniciovala změnu.Proto můžete provést další změny v úložišti bez otevření nové transakce.Změny může způsobit další obsluhu volání.
V případě, že transakce je vrací zpět, znovu provedené nebo vrátit zpět, není vhodné provádět změny v úložišti, změní se na prvky modelu, vztahy, tvary, diagramy spojnice nebo jejich vlastnosti.
Kromě toho by obvykle není aktualizaci hodnot při modelu je načítán ze souboru.
Změny modelu by proto chráněn zkouškou takto:
if (!store.InUndoRedoOrRollback
&& !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes
}
Naopak pokud vaše vlastnosti obslužné rutiny šíří změny mimo úložiště, například souboru, databázi nebo proměnné bez úložiště, pak si vždy tyto změny provést tak, aby externí hodnoty jsou aktualizovány, pokud uživatel vyvolá zpět nebo znovu.
Zrušení změn
Pokud chcete zabránit změně, můžete se vrátit zpět aktuální transakce.Můžete například zajistit, aby vlastnost zůstal v určité oblasti.
if (newValue > 10)
{ store.TransactionManager.CurrentTransaction.Rollback();
System.Windows.Forms.MessageBox.Show("Value must be less than 10");
}
Alternativní postup: vypočtené vlastnosti
Předchozí příklad ukazuje, jak lze pomocí OnValueChanged() šířit hodnoty z jedné domény vlastnosti.Každá vlastnost má vlastní uložené hodnoty.
Můžete místo toho zvažte definování vlastností odvozených jako vlastnost vypočtené.V tomto případě vlastnost nemá žádné vlastní skladování a definuje funkce je vyhodnocena při každém jeho hodnota je povinná.Další informace naleznete v tématu Vypočítané a vlastních vlastností úložiště.
Namísto předchozího příkladu, můžete nastavit druhu pole TextLengthCount se vypočtené v definici DSL.By poskytnout vlastní získat metoda pro tuto vlastnost domény.Získat metoda vrátí aktuální délka textu řetězec.
Potenciální nevýhodou vypočtené vlastnosti je však tento výraz je vyhodnocován při každém bude použita hodnota, která může představovat problém výkonu.Také je č. OnValueChanging() a OnValueChanged() na vypočtené vlastnosti.
Alternativní postup: Změna pravidla
Jestliže ChangeRule, je proveden na konci transakce, ve kterém se změní hodnota této vlastnosti.Další informace naleznete v tématu Pravidla rozšířit změny v rámci modelu.
Pokud v rámci jedné transakce několik změn, provede ChangeRule v případě, že jsou všechny dokončené.V kontrastu OnValue...metody jsou spouštěny při některé změny nebylo provedeno.V závislosti na tom, co chcete dosáhnout to může být ChangeRule, vhodnější.
ChangeRule lze také upravit hodnotu nové vlastnosti zachovat do určitého rozsahu.
Upozornění |
---|
Pokud pravidlo provádí změny obsahu úložiště, může být spuštěna další pravidla a vlastnosti obslužné rutiny.Pokud pravidlo změní vlastnost, která je spuštěna, bude znovu volána.Musí se proto ujistěte, že vaše pravidlo definice následek nekonečnou aktivaci. |
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
Description
Následující příklad přepisuje vlastnost popisovač vlastnosti domény a upozorní uživatele, pokud je 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);
}
}
}
}