도메인 속성 값 변경 처리기
에 Visual Studio 도메인 관련 언어를 도메인 속성의 값이 변경 되는 OnValueChanging() 및 OnValueChanged() 도메인 속성 처리기에서 메서드를 호출 합니다.변경에 응답 하려면이 메서드를 재정의할 수 있습니다.
속성 처리기 메서드 재정의
각 도메인 관련 언어의 도메인 속성 부모 도메인 클래스 내에 중첩 된 클래스에 의해 처리 됩니다.이름 형식은 다음과 같습니다. PropertyNamePropertyHandler.이 파일에서 속성 처리기 클래스를 검사할 수 있습니다 Dsl\Generated Code\DomainClasses.cs.클래스에서 OnValueChanging() 즉시 값 변경 되기 전에 호출 되 고 OnValueChanged() 값 변경 후 즉시 호출 됩니다.
라는 도메인 클래스를 예로 설명 라는 도메인 문자열 속성이 있는 텍스트 라는 정수 속성 및 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 메서드가 없습니다.
변경 처리기를 사용 하 여 새 값을 수정할 수 없습니다.예를 들어 값을 특정 범위로 제한, 정의 하는 작업을 수행 하는 경우는 ChangeRule.
관계의 역할을 나타내는 속성을 변경 하는 처리기를 추가할 수 없습니다.대신 정의 AddRule a DeleteRule 관계 클래스에 있습니다.이러한 규칙은 링크 만들어지거나 변경 되는 경우 트리거됩니다.자세한 내용은 규칙으로 모델 내부의 변경 내용 전파을 참조하십시오.
저장소의 변경 내용
속성 처리기 메서드 변경 시작 된 트랜잭션에서 호출 됩니다.따라서, 더 많은 저장소에 새 트랜잭션을 열지 않고도 변경할 수 있습니다.변경 내용을 추가 처리기 호출에서 발생할 수 있습니다.
트랜잭션이 실행 취소 된 경우 다시 실행, 또는 롤백 변경 해야 않는 저장소에서, 모델 요소, 관계, 도형, 연결선 다이어그램 또는 해당 속성을 변경 합니다.
모델 파일에서 로드 되는 경우 뿐만 아니라 여 대개 값 업데이트 하지 않습니다.
변경 내용은 모델에 따라서 이러한 테스트를 통해 해 서 보호 해야 합니다.
if (!store.InUndoRedoOrRollback
&& !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes
}
그러나 속성 처리기 저장소 외부 변경 내용을 전파 하는 경우 예를 들어, 파일, 데이터베이스 또는 저장소 변수를 다음 해야 항상 실행 취소 사용자가 호출 하는 경우 외부 값 업데이트 되도록 이러한 변경 하거나 다시 실행.
변경 취소
변경 하지 못하게 하려는 경우 현재 트랜잭션을 롤백할 수 있습니다.예를 들어, 속성은 특정 범위 내에서 유지 하려는 수도 있습니다.
if (newValue > 10)
{ store.TransactionManager.CurrentTransaction.Rollback();
System.Windows.Forms.MessageBox.Show("Value must be less than 10");
}
대체 방법: 계산 된 속성
이전 예제에서는 Onvaluechanged()를 사용 하 여 한 도메인 속성 값을 전파 하는 방법을 보여 줍니다.각 속성 자체 저장 된 값이 있습니다.
대신, 파생 된 속성은 계산 된 속성으로 정의 할 수도 있습니다.경우 속성 저장소가 자체를 정의 하는 것에 그 함수 값이 필요할 때마다 평가 됩니다.자세한 내용은 계산된 저장소 속성 및 사용자 지정 저장소 속성를 참조하십시오.
재단이 대신 이전 예제와는 종류 필드의 TextLengthCount 에 계산 된 열 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);
}
}
}
}