Domen właściwość wartość zmiany obsługi
W Visual Studio język specyficzne 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 zmiany, można zastąpić te metody.
Przesłanianie metod obsługi właściwości
Właściwości domeny każdego języka specyficzne dla domeny jest obsługiwane przez klasę, która jest zagnieżdżona w swojej klasie domeny nadrzędnej.Jego nazwa zgodna z formatem PropertyNamePropertyHandler.Można sprawdzić tej klasy obsługi właściwości w pliku Dsl\Generated Code\DomainClasses.cs.W klasie OnValueChanging() jest wywoływana niezwłocznie przed zmiany wartości i OnValueChanged() nazywa się natychmiast po zmianie wartości.
Na przykład, załóżmy, że masz klasę domeny o nazwie komentarz , ma właściwości domeny string o nazwie tekst i właściwość o nazwie TextLengthCount.Spowodować TextLengthCount zawsze do zawierają długość tekst ciąg znaków, można napisać następujący kod w oddzielnym pliku w programie project 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ę następujące kwestie dotyczące obsługi właściwości:
Właściwości metod obsługi są nazywane, zarówno gdy użytkownik wprowadza zmiany do właściwości domeny i gdy kod program przypisuje różne wartości do właściwości.
Metody są nazywane tylko wtedy, gdy wartość faktycznie zmienia się.Program obsługi nie zostanie wywołany, jeśli kod program przypisuje wartość, która jest równa bieżącej wartości.
Magazyn obliczeniowe i niestandardowych właściwości domeny nie metod OnValueChanged i OnValueChanging.
Za pomocą obsługi zmian nie można modyfikować nową wartość.Jeśli chcesz to zrobić, na przykład ograniczyć wartość do określonego zakresu, definiowanie w ChangeRule.
Nie można dodać obsługi Zmień właściwość, która reprezentuje rolę w relacji.Zamiast tego, zdefiniować AddRule i DeleteRule w klasie relacji.Zasady te są wyzwalane, gdy łącza są utworzone lub zmienione.Aby uzyskać więcej informacji, zobacz Zasady propagowanie zmian w ramach modelu.
Zmiany z magazynu
Właściwości, metod obsługi są nazywane wewnątrz transakcji, który zainicjował zmiany.W związku z tym można wprowadzać zmiany więcej w magazynie, bez konieczności otwierania nowych transakcji.Zmiany może spowodować dodatkowe obsługi wywołania.
Gdy jest Trwa wycofywanie transakcji, redone lub wycofana, nie należy podejmować zmian w magazynie, czyli zmiany na elementy modelu, relacje, kształty, diagramy łączniki lub ich właściwości.
Ponadto można byłoby zazwyczaj aktualizuje wartości podczas modelu jest ładowany z pliku.
Zmiany w modelu należy zatem strzec przez badania, jak to:
if (!store.InUndoRedoOrRollback
&& !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes
}
Z drugiej strony, jeśli Twój program obsługi właściwość propaguje zmiany poza magazynu, na przykład plik, baza danych lub zmienne-store następnie możesz powinny zawsze wprowadzić te zmiany, tak aby wartości zewnętrznych są aktualizowane, gdy użytkownik wywołuje Cofnij lub Ponów.
Anulowanie zmian
Jeśli chcesz zapobiec zmianie, można wycofywać bieżącej transakcji.Na przykład można zapewnić, że właściwość pozostaje w określonym zakresie.
if (newValue > 10)
{ store.TransactionManager.CurrentTransaction.Rollback();
System.Windows.Forms.MessageBox.Show("Value must be less than 10");
}
Techniki alternatywne: obliczana właściwości
W poprzednim przykładzie przedstawiono, w jaki sposób OnValueChanged() może służyć do propagowania wartości z jednej domeny właściwości.Każda właściwość ma wartość przechowywaną.
Zamiast tego rozważyć zdefiniowanie pochodne właściwość jako właściwość obliczeniowe.W tym przypadku, właściwość ma nie własnych składowania i jest definiowanie obliczana jest funkcja, w każdym przypadku, gdy wymagana jest jej wartość.Aby uzyskać więcej informacji, zobacz Obliczone i niestandardowych właściwości magazynu.
Zamiast z poprzedniego przykładu, można ustawić rodzaju pola TextLengthCount za obliczeniowe w definicji DSL.Należałoby podać własne uzyskać metody dla tej właściwości domeny.Uzyskać metoda zwróci Bieżąca długość tekst ciąg znaków.
Jednak potencjalną wadą obliczone właściwości jest, że wyrażenie jest sprawdzane za każdym razem, gdy wartość jest używana, które mogą stwarzać problemy z wydajnością.Ponadto istnieje nr OnValueChanging() i OnValueChanged() obliczone właściwości.
Techniki alternatywne: zmiana zasad
W przypadku zdefiniowania ChangeRule, jest wykonywany po zakończeniu transakcji, w którym wartość właściwości zostanie zmieniona.Aby uzyskać więcej informacji, zobacz Zasady propagowanie zmian w ramach modelu.
Jeżeli kilka zmian w ramach jednej transakcji, ChangeRule wykonuje, gdy zostały one ukończone wszystkie.Przez kontrast, OnValue...metody są wykonywane, gdy niektóre zmiany nie zostały przeprowadzone.W zależności od tego, co chcesz osiągnąć to może być ChangeRule bardziej odpowiednie.
ChangeRule można również użyć, aby dopasować wartość nowej właściwości, utrzymanie go w określonym zakresie.
![]() |
---|
Jeśli reguła wprowadza zmiany w zawartości magazynu, może być wywołany innych reguł i właściwości obsługi.Jeśli reguła zmienia właściwość, która wyzwoliła go, będzie będą wywoływane ponownie.Należy upewnić się, że reguła definicji nie powodują 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 obsługi właściwości właściwości domeny i powiadamia użytkownika, gdy właściwość dla ExampleElement klasy domeny została zmieniona.
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);
}
}
}
}