다음을 통해 공유


도메인 속성 값 변경 처리기

에 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 관계 클래스에 있습니다.이러한 규칙은 링크 만들어지거나 변경 되는 경우 트리거됩니다.자세한 내용은 규칙으로 모델 내부의 변경 내용 전파을 참조하십시오.

Bb126481.collapse_all(ko-kr,VS.110).gif저장소의 변경 내용

속성 처리기 메서드 변경 시작 된 트랜잭션에서 호출 됩니다.따라서, 더 많은 저장소에 새 트랜잭션을 열지 않고도 변경할 수 있습니다.변경 내용을 추가 처리기 호출에서 발생할 수 있습니다.

트랜잭션이 실행 취소 된 경우 다시 실행, 또는 롤백 변경 해야 않는 저장소에서, 모델 요소, 관계, 도형, 연결선 다이어그램 또는 해당 속성을 변경 합니다.

모델 파일에서 로드 되는 경우 뿐만 아니라 여 대개 값 업데이트 하지 않습니다.

변경 내용은 모델에 따라서 이러한 테스트를 통해 해 서 보호 해야 합니다.

if (!store.InUndoRedoOrRollback 
         && !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes 
}

그러나 속성 처리기 저장소 외부 변경 내용을 전파 하는 경우 예를 들어, 파일, 데이터베이스 또는 저장소 변수를 다음 해야 항상 실행 취소 사용자가 호출 하는 경우 외부 값 업데이트 되도록 이러한 변경 하거나 다시 실행.

Bb126481.collapse_all(ko-kr,VS.110).gif변경 취소

변경 하지 못하게 하려는 경우 현재 트랜잭션을 롤백할 수 있습니다.예를 들어, 속성은 특정 범위 내에서 유지 하려는 수도 있습니다.

if (newValue > 10) 
{ store.TransactionManager.CurrentTransaction.Rollback();
  System.Windows.Forms.MessageBox.Show("Value must be less than 10");
} 

Bb126481.collapse_all(ko-kr,VS.110).gif대체 방법: 계산 된 속성

이전 예제에서는 Onvaluechanged()를 사용 하 여 한 도메인 속성 값을 전파 하는 방법을 보여 줍니다.각 속성 자체 저장 된 값이 있습니다.

대신, 파생 된 속성은 계산 된 속성으로 정의 할 수도 있습니다.경우 속성 저장소가 자체를 정의 하는 것에 그 함수 값이 필요할 때마다 평가 됩니다.자세한 내용은 계산된 저장소 속성 및 사용자 지정 저장소 속성를 참조하십시오.

재단이 대신 이전 예제와는 종류 필드의 TextLengthCount 에 계산 된 열 DSL 정의 합니다.직접 제공 합니다 가져오기 이 도메인 속성에 대 한 방법.가져오기 메서드의 현재 길이 반환 하는 텍스트 문자열.

그러나 단점이 계산 된 속성 값은 성능 문제가 발생할 수 있습니다 사용 될 때마다 식이 계산 됩니다.또한, 있을 없음 OnValueChanging() 및 OnValueChanged() 계산 된 속성을 합니다.

Bb126481.collapse_all(ko-kr,VS.110).gif대체 방법: 규칙 변경

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) }; 
 }
} 

예제

Bb126481.collapse_all(ko-kr,VS.110).gif설명

다음은 속성 처리기의 도메인 속성을 재정의 하 고 속성을 때 사용자에 게 알리는 ExampleElement 도메인 클래스가 변경 되었습니다.

Bb126481.collapse_all(ko-kr,VS.110).gif코드

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);
      }
    }
  }
}

참고 항목

참조

OnValueChanged

OnValueChanging