Обработчики изменений значений свойств доменов
В выражении Visual Studio доменный язык, при изменении значения свойства домена OnValueChanging() и OnValueChanged() методы вызываются в обработчике свойств домена.Чтобы ответить на изменение можно переопределить эти методы.
Переопределять методы обработчика свойства
Каждое свойство домена для доменного языка обрабатывается классом, который вложен в пределах своего родительского класса домена.Имя его следовать формату propertyNamePropertyHandler.Можно проверить этот класс обработчика свойства в файле Dsl\Generated Code\DomainClasses.cs.В классе OnValueChanging() вызывается непосредственно перед тем, значение изменяется и OnValueChanged() вызывается сразу после значение меняется.
Например, предположим, что имеется доменный класс быть именованным Примечание то есть свойство с именем домена строки Текст и свойства с именем integer TextLengthCount.Вызвать TextLengthCount всегда содержать длина Текст строка, можно написать следующий код в отдельном файле в проекте 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;
}
}
}
Обратите внимание на следующие моменты об обработчиках свойства:
Обработчик вызываются методы и свойства, когда пользователь вносит изменения в свойство домена, а программный код присвоит другое значение к свойству.
Методы вызываются только в случае, если фактически изменяет значение.Обработчик не вызывается, если программный код присвоит значение, равен текущему значению.
Вычисляемые и пользовательские свойства домена хранилища не содержат методы OnValueChanged и OnValueChanging.
Нельзя использовать обработчик изменений для изменения новое значение.Если требуется сделать, которые, например для ограничения к указанному диапазону значение, указывающее, a ChangeRule.
Невозможно добавить обработчик изменения к свойству, которое представляет роль связи.Вместо этого укажите AddRule и a DeleteRule в классе отношений.Эти правила активированы, если создаются или изменяются ссылками.Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.
Изменения в и из хранилища
Методы обработчика свойства называются внутри транзакции, ввела изменения изменение.Таким образом, можно выполнить несколько изменений в хранилище, не открывая новую транзакцию.Изменения могут привести к появлению дополнительных вызовов обработчика.
Если отменить вернуть или откатить транзакцию, не следует вносить изменения в хранилище, то есть изменения к элементам модели связей, фигурам, схемами соединителей или их свойствам.
Кроме того, обычно не обновитьTfи бы значения, когда модель нагрузится из файла.
Изменения в модели должны быть защищены таким образом теста следующим образом:
if (!store.InUndoRedoOrRollback
&& !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes
}
Напротив, если обработчик свойств передает изменения вне хранилища, например, к файлу базы данных или переменных non-магазина, то необходимо всегда делать эти изменения, так что внешние значения обновляются, когда пользователь вызывает отката или повтора.
Отменить изменение
Если требуется запретить изменение, можно откатить текущую транзакцию.Например, может потребоваться обеспечить свойство остается в определенный диапазон.
if (newValue > 10)
{ store.TransactionManager.CurrentTransaction.Rollback();
System.Windows.Forms.MessageBox.Show("Value must be less than 10");
}
Альтернативный метод: Вычисляемые свойства
Предыдущий пример показывает, как OnValueChanged () можно использовать, чтобы передавать значения из одного свойства домена в другой.Каждое свойство имеет собственное сохраненное значение.
Вместо этого можно рассматривать как задать свойству производное вычисленное свойство.В этом случае вычисляется свойство не имеет хранение его и задающий функцию, если его значение не требуется.Дополнительные сведения см. в разделе Вычисляемые и пользовательские свойства хранилища.
Вместо предыдущего примера можно установить Тип поле TextLengthCount необходимо CALCULATED в определении DSL.Вы бы предусмотрены свои Получить метод этого свойства домена.Получить метод вернул бы текущую длину Текст строка.
Однако потенциальный недостаток вычисленных свойств, что выражение вычисляется при каждом значение используется, которое может представлять проблемы производительности.Кроме того, ни OnValueChanging () и OnValueChanged (вычисляемого) в свойстве.
Альтернативный метод: правила изменения
При указании ChangeRule, оно выполняется в конце транзакции, в которой значение свойства изменяется.Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.
Если внесены некоторые изменения в одной транзакции, ChangeRule выполняется при их завершения.Напротив, OnValue…методы выполняются, когда некоторые из изменений не выполнялись.В зависимости от того, что требуется добиться, это может сделать ChangeRule более подходящим.
Можно также использовать ChangeRule для обработки новое значение свойства, чтобы сохранять его в определенный диапазон.
Внимание |
---|
Если правило изменения к содержимому магазина, то другие обработчики правил и свойства могут быть активированы.Если правило изменяет свойство, активировало оно будет вызывается снова.Необходимо убедиться в том, что определения правила не приводят к бесконечному активировать. |
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) };
}
}
Пример
Описание
В следующем примере переопределяются обработчик свойства домена и уведомляет пользователя, если свойство ExampleElement доменный класс был изменен.
Код
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);
}
}
}
}