Sdílet prostřednictvím


Obslužné rutiny události šíří změny mimo model

Vizualizace a modelování SDK můžete definovat úložiště obslužné rutiny událostí změny zdrojů mimo úložiště jako proměnné bez úložiště, soubory, modely v jiných obchodů nebo jiné rozšíření Visual Studio rozšíření.Úložiště obslužné rutiny událostí jsou spouštěny po ukončení transakce došlo k spouštěcí událost.Také jsou prováděna v operaci zpět nebo znovu.Na rozdíl od úložiště pravidel jsou proto nejužitečnější pro aktualizaci hodnot, které jsou mimo úložiště události v úložišti.Na rozdíl od.NET události úložiště obslužné rutiny událostí jsou registrovány na naslouchání třídy: není nutné zaregistrovat samostatný popisovač pro každou instanci.Další informace o výběru mezi různými způsoby zpracování změny Reagování na změny a šíření změn.

Grafické povrchu a jiných ovládacích prvků uživatelského rozhraní jsou příklady externí zdroje, které mohou zpracovávat události v úložišti.

Definujte úložiště událostí

  1. Vyberte typ událostí, které chcete sledovat.Úplný seznam, podívejte se na vlastnosti EventManagerDirectory.Každá vlastnost odpovídá typu události.Nejčastěji používané událostí, které typy jsou:

    • ElementAdded– spuštěna při prvku modelu, vztah odkaz, tvar nebo konektor je vytvořen.

    • ElementPropertyChanged – je aktivována, když hodnota Normal je změněna vlastnost domény.Událost se spouští pouze v případě, že nové a staré hodnoty nejsou shodné.Událost nelze použít pro skladování vypočítaná a vlastní vlastnosti.

      Nelze ji použít vlastnosti role, které odpovídají vztah odkazy.Místo toho použijte ElementAdded sledovat vztah domény.

    • ElementDeleted– Při aktivaci po prvek modelu vztah, tvar nebo spojovací byla odstraněna.Hodnoty vlastností prvku můžete nadále přistupovat, ale nebude mít žádné vztahy s ostatními prvky.

  2. Přidat definici dílčí třídy pro YourDslDocData v souboru samostatný kód v DslPackage projektu.

  3. Napište kód události jako metoda, jako v následujícím příkladu.Může být static, pokud chcete získat přístup k DocData.

  4. Přepsat OnDocumentLoaded() zaregistrovat popisovač.Pokud máte více než jednu rutinu, můžete zaregistrovat na stejném místě.

Umístění registrační kód není kritická.DocView.LoadView()je alternativní umístění.

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

}

Pomocí události pro vrátit úpravy v úložišti

Úložiště události obvykle se nepoužívají pro šíření změn uvnitř úložiště, protože obslužná rutina události spustí po je transakce potvrzena.Místo toho by použít pravidlo úložiště.Další informace naleznete v tématu Pravidla šířící změny v modelu.

Obslužné rutiny události nelze však použít provést další aktualizace úložiště, pokud má uživatel moci vrátit další aktualizace odděleně od původní událost.Předpokládejme například, že malé znaky jsou obvyklé úmluvy alb.Můžete napsat obslužné rutiny události úložiště, která opravuje hlavy na malá písmena, po zadané uživatelem je velká.Ale uživatele nelze použít příkaz Zpět Zrušit opravu, obnovení znaky na velká písmena.Druhý zpět by odebrat uživatele změnit.

Naopak pokud jste napsali provedou totéž pravidlo úložiště, změna uživatele a opravu by v rámci jedné transakce tak, že uživatel není bez ztráty původních změnit zpět úpravy.

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.
}

Je-li zapsat událost aktualizuje úložiště:

  • Použití store.InUndoRedoOrRollback zabránit v provádění změn zpět prvky modelu.Správce transakcí vše nastavit v úložišti zpět do původního stavu.

  • Použití store.InSerializationTransaction zabránit v provádění změn, zatímco v modelu je načítán ze souboru.

  • Změny způsobí další události aktivován.Zkontrolujte, zda se vyhnout nekonečné smyčky.

Typy událostí úložiště

Každý typ události odpovídá kolekci v Store.EventManagerDirectory.Můžete přidat nebo odebrat obslužné rutiny událostí kdykoli, ale je obvyklé při načtení dokumentu je přidat.

EventManagerDirectoryNázev vlastnosti

Při spuštění

ElementAdded

Je vytvořena instance třídy domény, vztah domény, tvar, spojnice nebo diagramu.

ElementDeleted

Prvek modelu odebrán prvek adresáře úložišti a již zdroj nebo cíl jakýkoli vztah.Prvek nebude odstraněn z paměti, ale je ponechána v budoucnu zpět.

ElementEventsBegun

Vyvolat na konci vnější transakce.

ElementEventsEnded

Vyvolána, pokud byly zpracovány všechny události.

ElementMoved

Prvek modelu byla přesunuta z jednoho úložiště oddíl do druhého.

To nesouvisí s umístění obrazce v diagramu.

ElementPropertyChanged

Byla změněna hodnota vlastnosti domény.Proveden pouze v případě, že nerovné staré a nové hodnoty.

RolePlayerChanged

Jednu ze dvou rolí (ukončení) relace odkazuje na nový prvek.

RolePlayerOrderChanged

V roli s násobnost větší než 1 změnil pořadí odkazů.

TransactionBeginning

TransactionCommitted

TransactionRolledBack

Viz také

Další zdroje

Reagování na změny a šíření změn

Ukázkový kód: okruhů