Поделиться через


Обработчики событий распространяют изменения за пределы модели

В пакете SDK для визуализации данных и моделирования можно указать обработчики событий хранилища для распространения изменений к ресурсам вне хранилища, как переменные non-магазина, файлы модели в другом хранения или другое Visual Studio расширения.Обработчики событий хранилища выполняются после окончания транзакции, активируя в которой произошло событие.Они также выполняются в откате или вернут операции.Таким образом, в отличие от правил хранилища, события хранилища наиболее полезны для обновления значения вне хранилища.В отличие от событий .NET, обработчики событий хранилища зарегистрированных для прослушивания к классу: не следует зарегистрировать отдельный обработчик для каждого экземпляра.Дополнительные сведения о том, как выбрать между различными способами обработки изменений см. в разделе Реагирование на изменения и их распространение.

Графическая область и другие элементы управления пользовательского интерфейса примеры внешних ресурсов, которое может быть обработано событиями хранилища.

Определить событие хранилища

  1. Выберите тип события, который нужно отслеживать.Полный список см. свойства EventManagerDirectory.Каждое свойство соответствует типу события.Наиболее часто используемые типы события:

    • ElementAdded - активировано при создании элемент модели, связь связи, форма или соединитель.

    • Если значение - ElementPropertyChanged активированное Normal свойство домена изменено.Событие активированы, только если новые и старые значения не равны.Событие вычисленными и не могут применяться к пользовательским свойствам хранения.

      Ее нельзя применить к роли свойств, которые соответствуют ссылкам связи.Вместо этого используйте ElementAdded мониторинг доменную ссылку.

    • ElementDeleted - активированы после элемента модели, связи, фигуры или соединителя удаления.Можно получить доступ к значениям свойств элементов, однако оно не будет иметь связи с другими элементами.

  2. Добавьте определение разделяемого класса для 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);
    }
  }

}

С помощью событий, чтобы сделать отменяемой коррекции в хранилище

События хранилища, как правило, не используются для распространения изменений в хранилища, поскольку обработчик событий выполняется после фиксации транзакции.Вместо этого можно использовать правило хранилища.Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.

Однако можно использовать обработчик событий, чтобы вносить дополнительные обновления к хранилищу, если пользователь должен иметь возможность отмены дополнительные обновления отдельно от исходного события.Например, предположим, что символы в нижнем регистре стандартное соглашение для заголовков альбома.Можно написать обработчик событий исправляет название магазина, в нижний регистр, после того как пользователь типизированные его в верхний случае.Однако пользователь может использовать команду отката отменить ваша коррекция, при восстановлении upper - символы вариантов.Второй откат удалитьTm бы изменение пользователя.

Напротив, если был написан правило хранилища сделать то же самое, то изменение пользователя и ваша коррекция было бы в той же транзакции, так как пользователь не может отменить настройку без потери исходное изменение.

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

Значение свойства домена.Это выполняется только в том случае, если старые и новые значения не равны.

RolePlayerChanged

Одна из конечных элементов отношения ролей (2) ссылается на новый элемент.

RolePlayerOrderChanged

В роли с количеством элементов больше 1, последовательность ссылок.

TransactionBeginning

TransactionCommitted

TransactionRolledBack

См. также

Другие ресурсы

Реагирование на изменения и их распространение

Образец кода: принципиальные схемы