다음을 통해 공유


이벤트 처리기로 모델 외부의 변경 내용 전파

시각화 및 모델링 SDK에서 외부 저장소를 사용 하지 않는 변수, 파일, 다른 저장소 또는 다른 모델의 저장소 리소스에 대 한 변경 내용을 전파 하는 저장소 이벤트 처리기를 정의할 수 있습니다 Visual Studio 확장 합니다.저장소 이벤트 처리기를 트리거하는 이벤트가 발생 한 트랜잭션의 끝 후 실행 됩니다.또한 실행 취소 또는 다시 실행 작업에서 실행 됩니다.따라서 저장소 규칙과 달리 저장소 이벤트 저장소 밖에 있는 값을 업데이트 하는 데 가장 유용 합니다.달리.NET 이벤트, 저장소 이벤트 처리기 클래스를 수신 하도록 등록 됩니다: 각 인스턴스에 대해 별도 처리기를 등록할 필요가 없습니다.변경 내용을 처리 하는 다른 방법을 사이 선택 하는 방법에 대 한 자세한 내용은 참조 하십시오. 변경 내용에 대한 대응 및 전파.

그래픽 화면 및 기타 사용자 인터페이스 컨트롤 저장소 이벤트에 의해 처리 될 수 있는 외부 리소스의 예입니다.

저장소 이벤트를 정의 하려면

  1. 모니터링할 이벤트를 선택 합니다.전체 목록에 대 한 속성을 찾는 EventManagerDirectory.이벤트의 형식으로 각 속성에 해당 합니다.가장 자주 사용 되는 이벤트 유형입니다.

    • ElementAdded-모델 요소가 있으면 유발, 관계 링크, 도형 또는 연결선 생성 됩니다.

    • ElementPropertyChanged – 트리거되는 시기의 값은 Normal 도메인 속성을 변경 합니다.새 및 이전 값과 같은있지 않습니다 경우에 이벤트가 트리거됩니다.이벤트는 저장소를 계산 하 고 사용자 지정 속성에 적용할 수 없습니다.

      관계에 대 한 링크에 해당 하는 역할 속성을 적용할 수 없습니다.대신 사용 하 여 ElementAdded 도메인 관계를 모니터링할 수 있습니다.

    • ElementDeleted-모델 요소 다음 트리거, 관계, 도형 또는 연결선 삭제 되었습니다.속성 값의 요소를 계속 액세스할 수 있지만 없는 관계의 요소를 갖게 됩니다.

  2. Partial 클래스 정의에 추가 YourDslDocData 에 있는 별도 코드 파일에는 DslPackage 프로젝트.

  3. 다음 예제에서와 같이 하는 방법으로 이벤트의 코드를 작성 합니다.수 있습니다 static에 액세스 하지 않는 경우, DocData.

  4. 재정의 OnDocumentLoaded() 처리기를 등록 합니다.둘 이상의 처리기가 있는 경우 모두 같은 위치에 등록할 수 있습니다.

등록 코드의 위치는 중요 하지 않습니다.DocView.LoadView()대체 위치가입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.Modeling;

namespace Company.MusicLib
{
  partial class MusicLibDocData
  {
    // Register store events here or in DocView.LoadView().
    protected override void OnDocumentLoaded()
    {
      base.OnDocumentLoaded(); // Don’t forget this.

      #region Store event handler registration.     
      Store store = this.Store;
      EventManagerDirectory emd = store.EventManagerDirectory;
      DomainRelationshipInfo linkInfo = store.DomainDataDirectory
          .FindDomainRelationship(typeof(ArtistAppearsInAlbum));
      emd.ElementAdded.Add(linkInfo, 
          new EventHandler<ElementAddedEventArgs>(AddLink));
      emd.ElementDeleted.Add(linkInfo, 
          new EventHandler<ElementDeletedEventArgs>(RemoveLink));

      #endregion Store event handlers.
    }

    private void AddLink(object sender, ElementAddedEventArgs e)
    {
      ArtistAppearsInAlbum link = e.ModelElement as ArtistAppearsInAlbum;
      if (link != null) 
            ExternalDatabase.Add(link.Artist.Name, link.Album.Title);
    }
    private void RemoveLink(object sender, ElementDeletedEventArgs e)
    {
      ArtistAppearsInAlbum link = e.ModelElement as ArtistAppearsInAlbum;
      if (link != null) 
            ExternalDatabase.Delete(link.Artist.Name, link.Album.Title);
    }
  }

}

저장소에 대 한 조정이 실행 취소할 수 있는 이벤트를 사용 하 여

트랜잭션이 커밋된 후 이벤트 처리기를 실행 하기 때문에 저장소 이벤트 정상적으로 저장소 내의 변경 내용 전파에 대 한를 사용 하지는 않습니다.대신 저장소 규칙을 사용 합니다.자세한 내용은 규칙으로 모델 내부의 변경 내용 전파를 참조하십시오.

그러나 원래 이벤트는 별도로 추가 업데이트를 취소할 수 있도록 사용자가 필요한 경우 이벤트 처리기를 저장소에 추가 업데이트를 수행할 수 있습니다.예를 들어, 소문자 앨범 타이틀에 대 한 일반적인 규칙이 있는지 가정 합니다.사용자가 대문자를 입력 한 후에 수정 제목 낮은 경우에는 저장소 이벤트 처리기를 쓸 수 있습니다.그러나 사용자는 실행 취소 명령을 대문자로 문자 복원 사용자 고침 취소 수 있습니다.두 번째 실행 취소 사용자 변경을 제거 될 수 있습니다.

동일한 작업을 수행 하는 저장소 규칙을 작성 한 경우 사용자를 원래 변경 하면서 조정을 취소할 수 없습니다 있도록 달리 사용자의 변경 및 수정 내용을 동일한 트랜잭션에서 됩니다.

partial class MusicLibDocView
{
    // Register store events here or in DocData.OnDocumentLoaded().
    protected override void LoadView()
    {
      /* Register store event handler for Album Title property. */
      // Get reflection data for property:
      DomainPropertyInfo propertyInfo = 
        this.DocData.Store.DomainDataDirectory
        .FindDomainProperty(Album.TitleDomainPropertyId);
      // Add to property handler list:
      this.DocData.Store.EventManagerDirectory
        .ElementPropertyChanged.Add(propertyInfo,
        new EventHandler<ElementPropertyChangedEventArgs>
             (AlbumTitleAdjuster));

      /*
      // Alternatively, you can set one handler for 
      // all properties of a class.
      // Your handler has to determine which property changed.
      DomainClassInfo classInfo = this.Store.DomainDataDirectory
           .FindDomainClass(typeof(Album));
      this.Store.EventManagerDirectory
          .ElementPropertyChanged.Add(classInfo,
        new EventHandler<ElementPropertyChangedEventArgs>
             (AlbumTitleAdjuster));
       */
      return base.LoadView();
    }

// Undoable adjustment after a property is changed. 
// Method can be static since no local access.
private static void AlbumTitleAdjuster(object sender,
         ElementPropertyChangedEventArgs e)
{
  Album album = e.ModelElement as Album;
  Store store = album.Store;

  // We mustn't update the store in an Undo:
  if (store.InUndoRedoOrRollback 
      || store.InSerializationTransaction)
      return;

  if (e.DomainProperty.Id == Album.TitleDomainPropertyId)
  {
    string newValue = (string)e.NewValue;
    string lowerCase = newValue.ToLowerInvariant();
    if (!newValue.Equals(lowerCase))
    {
      using (Transaction t = store.TransactionManager
            .BeginTransaction("adjust album title"))
      {
        album.Title = lowerCase;
        t.Commit();
      } // Beware! This could trigger the event again.
    }
  }
  // else other properties of this class.
}

저장소를 업데이트 하는 이벤트를 작성 하는 경우:

  • 사용 store.InUndoRedoOrRollback 취소에 모델 요소를 변경 하지 않도록 합니다.트랜잭션 관리자 모든 작업 저장소를 원래 상태로 다시 설정 합니다.

  • 사용 store.InSerializationTransaction 파일에서 모델 로드 되는 동안 변경 하지 않도록 합니다.

  • 변경 내용을 더 이상 이벤트를 트리거할 수 발생 합니다.무한 루프가 발생 하지 않도록 해야 합니다.

저장소 이벤트 형식

각 이벤트 형식에 Store.EventManagerDirectory 컬렉션에 해당합니다.추가 하거나 이벤트 처리기를 언제 든 지 제거할 수 있습니다 있지만 문서를 로드할 때 해당 추가 평소 있습니다.

EventManagerDirectory속성 이름

때 실행

ElementAdded

도메인 클래스, 도메인 관계, 도형, 연결선 또는 다이어그램의 인스턴스를 만듭니다.

ElementDeleted

모델 요소는 저장소 요소 디렉터리에서 제거 된 및 원본 또는 대상의 모든 관계를 더 이상 없습니다.요소는 실제로 메모리에서 삭제 되지 않습니다 하지만 이후 실행 취소의 경우 유지 됩니다.

ElementEventsBegun

바깥쪽 트랜잭션의 끝에서 호출 됩니다.

ElementEventsEnded

다른 이벤트를 모두 처리 되 면 호출 됩니다.

ElementMoved

모델 요소 저장소 파티션에서 다른 위치로 이동 되었습니다.

이 다이어그램에서 셰이프의 위치에 관련 되지 않았습니다.

ElementPropertyChanged

Domain 속성의 값을 변경 합니다.만 이전 값과 새 값 동일 하지 않은 경우에 실행 됩니다.

RolePlayerChanged

관계의 두 가지 역할 (끝) 중 하나에 새 요소를 참조합니다.

RolePlayerOrderChanged

복합성이 1 보다 큰 역할을 링크의 순서를 변경 했습니다.

TransactionBeginning

TransactionCommitted

TransactionRolledBack

참고 항목

기타 리소스

변경 내용에 대한 대응 및 전파

코드 샘플: 회로 다이어그램