Obsługa zmian wartości właściwości domeny
W Visual Studio języka specyficznego dla domeny, gdy wartość właściwości domeny, OnValueChanging() i OnValueChanged() metody są wywoływane w obsłudze właściwości domeny.Aby odpowiedzieć na zmianę, można zastąpić tych metod.
Zastępowanie metody obsługi właściwości
Właściwość domeny każdego języka specyficznego dla domeny jest obsługiwane przez klasę, która jest zagnieżdżona w jej nadrzędnej klasy domeny.Jego nazwa jest zgodna z formatem PropertyNamePropertyHandler.Można sprawdzić tej właściwości klasy obsługi w pliku Dsl\Generated Code\DomainClasses.cs.W tej klasie OnValueChanging() jest wywoływana bezpośrednio przed zmiany wartości i OnValueChanged() jest wywoływana bezpośrednio po zmiany wartości.
Załóżmy, że masz klasę domeny o nazwie komentarz ma domeny właściwość w postaci ciągu o nazwie tekstu i właściwość typu Liczba całkowita o nazwie TextLengthCount.Spowodować TextLengthCount zawsze w celu uwzględnienia długość tekstu ciąg, następujący kod można zapisać w oddzielnym pliku w projekcie 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;
}
}
}
Zwróć uwagę na następujące kwestie dotyczące programów obsługi właściwości to:
Właściwości metod obsługi są wywoływane zarówno po dokonaniu zmian we właściwości domeny, jak i po kodu programu przypisuje inną wartość do właściwości.
Metody są wywoływane tylko wtedy, gdy rzeczywiście zmienia wartość.Program obsługi nie zostanie wywołany, jeśli kod programu przypisuje wartość, która jest taki sam, jak bieżąca wartość.
Właściwości domeny magazynu obliczeniowych i niestandardowych metod OnValueChanged i OnValueChanging nie jest konieczne.
Program obsługi zmiany nie można używać do modyfikowania nowej wartości.Jeśli chcesz to zrobić, na przykład ograniczyć wartość do określonego zakresu, definiować ChangeRule.
Nie można dodać obsługi zmiany we właściwości, która reprezentuje rolę relacji.Zamiast tego należy zdefiniować AddRule i DeleteRule klasy relacji.Te zasady są wyzwalane utworzenia lub zmienić łącza.Aby uzyskać więcej informacji, zobacz Reguły propagujące zmiany w modelu.
Zmiany i Magazyn
Właściwość obsługi są wywoływane w transakcji, który zainicjował zmianę.W związku z tym bez konieczności otwierania nowych transakcji można dokonać więcej zmian w magazynie.Wywołuje program obsługi dodatkowych może spowodować zmiany.
Gdy jest on wycofywania transakcji, wykonać ponownie lub wycofana, nie należy zmian w magazynie, oznacza to, że zmiany w elementy modelu, relacje, kształtów, diagramy łączniki lub ich właściwości.
Ponadto czy zwykle nie zaktualizujesz wartości podczas ładowania modelu z pliku.
Zmiany w modelu powinien być dlatego osłonięte teście w taki sposób:
if (!store.InUndoRedoOrRollback
&& !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes
}
Z drugiej strony Jeśli Twój program obsługi właściwości propaguje zmiany poza magazynu, na przykład do pliku, bazy danych lub zmienne użytku osobistego, następnie należy zawsze zmiany będą tak, aby zewnętrznych podlega aktualizacji, gdy użytkownik wywołuje Cofnij lub wykonaj ponownie.
Trwa anulowanie zmiany
Jeśli chcesz uniknąć zmian, można wycofać bieżącej transakcji.Można na przykład, upewnij się, że właściwość pozostanie do określonego zakresu.
if (newValue > 10)
{ store.TransactionManager.CurrentTransaction.Rollback();
System.Windows.Forms.MessageBox.Show("Value must be less than 10");
}
Alternatywna metoda: obliczana właściwości
W poprzednim przykładzie przedstawiono, jak można używać OnValueChanged() propagację wartości z właściwości jednej domeny.Każda właściwość ma własny wartości przechowywanej.
Zamiast tego można rozważyć definiowania pochodnej właściwość jako właściwość obliczeniowa.W tym przypadku właściwość ma nie magazynu własnych oraz zdefiniować obliczeniu zawsze, gdy jego wartość jest wymagana.Aby uzyskać więcej informacji, zobacz Obliczone i niestandardowe właściwości przechowywania.
Zamiast poprzedniego przykładu, można ustawić rodzaju zakres TextLengthCount za obliczeniowa w definicji DSL.Czy podać własną uzyskać metody dla tej właściwości domeny.Uzyskać metoda zwróci bieżącą długość tekstu ciąg.
Potencjalną wadą obliczeniowe właściwości jest jednak, że wyrażenie jest szacowana za każdym razem, gdy jest używana wartość, która może być ryzykowne problemy z wydajnością.Ponadto istnieje nie OnValueChanging() i OnValueChanged() we właściwości obliczeniowej.
Alternatywna metoda: zasady zmiany
Po zdefiniowaniu ChangeRule jest uruchamiany na końcu transakcji, w którym zostanie zmieniona wartość właściwości.Aby uzyskać więcej informacji, zobacz Reguły propagujące zmiany w modelu.
Jeśli kilka zmian w jednej transakcji, ChangeRule realizowana, gdy są one wszystkie pełne.Przez kontrast, OnValue...metody są wykonywane, gdy niektóre zmiany nie została wykonana.W zależności od tego, co chcesz osiągnąć to może uniemożliwić ChangeRule bardziej odpowiednie.
Umożliwia także ChangeRule może dostosować nową wartość właściwości, aby utrzymać ją do określonego zakresu.
![]() |
---|
Jeśli reguły zmienia zawartość magazynu, mogły zostać wyzwolone innych zasad i programy obsługi właściwości.Zmiana właściwości, które go spowodowało go, reguły zostanie ponownie wywołany.Należy się upewnić, że do definicji reguły spowoduje wyzwolenie nieograniczone. |
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) };
}
}
Przykład
Opis
W poniższym przykładzie zastępuje program obsługi właściwości właściwości domeny i powiadamia użytkownika, gdy właściwość dla ExampleElement klasy domeny został zmieniony.
Kod
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);
}
}
}
}