Aracılığıyla paylaş


Olay işleyicilerini modeli dışında değişiklikleri yaymak

Görselleştirme ve modelleme sdk, mağaza olmayan değişkenler, dosyalar, diğer mağazalarda veya diğer modeller gibi deposu dışında kaynakları değişiklikleri yaymak için olay işleyicileri deposu tanımlayabilirsiniz Visual Studio uzantıları.Mağaza olay işleyicileri olay gerçekleştiği işlemin sonunda yürütülür.Bunlar aynı zamanda bir geri alma veya yineleme işlemi yürütülür.Bu nedenle, mağaza kurallarından farklı olarak, deposu olayları deposu değerleri güncelleştirmek için en kullanışlı olandır.Aksine.net olayları, mağaza olay işleyicileri bir sınıfa dinlemek için kayıtlı: her örneği ayrı bir işleyicisi kaydetmek zorunda değilsiniz.Değişiklikleri yürütmek için farklı yöntemler arasında seçme konusunda daha fazla bilgi için bkz: Yanıtlama ve değişiklikleri yayılıyor.

Grafik yüzey ve diğer kullanıcı arabirimi kontrolleri deposu olayların ele alınması dış kaynaklara örnektir.

Mağaza olayı tanımlamak için

  1. İzlemek istediğiniz olay türünü seçin.At özelliklerinin tam listesi için Ara EventManagerDirectory.Her özelliği, olay türüne karşılık gelir.En sık olay türleri kullanılır:

    • ElementAdded– modeli öğe geldiğinde harekete geçirilen, ilişki bağlantı, Şekil veya bağlayıcı oluşturulur.

    • ElementPropertyChanged – harekete değerinin bir Normal domain özelliği değişti.Yalnızca eski ve yeni değerleri eşit değilse bu olay tetiklenir.Olay, hesaplanan ve özel depolama özelliklerine uygulanamaz.

      İlişki bağlantılar karşılık rolü özellikleri için uygulanamaz.Bunun yerine, ElementAdded etki alanı ilişkisi izlemek için.

    • ElementDeleted– model öğesinden sonra tetiklenen, ilişki, Şekil veya bağlayıcı silindi.Öğenin özellik değerlerini erişmeye devam edebilirsiniz, ancak hiçbir ilişkileri diğer öğelere sahip olacaktır.

  2. Kısmi sınıf tanımına ekleme YourDslDocData ayrı kod dosyasında DslPackage proje.

  3. Aşağıdaki örnekte olduğu gibi bir yöntem olarak olayın kodu yazmak.Böylece static, erişmek istediğiniz sürece DocData.

  4. Geçersiz kılma OnDocumentLoaded() işleyici kaydedilemedi.Birden fazla işleyicisi varsa, aynı yerde kaydedebilirsiniz.

Kayıt kodunun konumunu kritik değildir.DocView.LoadView()alternatif bir konumdur.

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

}

Olayları deposunda geri alınamaz ayarlamalar yapmak için kullanma

İşlem sonra olay işleyicisi yürüttüğünden deposu olayları normalde değişiklikleri deposu içine yayılması için kullanılmaz.Bunun yerine, bir mağaza kural kullanabilirsiniz.Daha fazla bilgi için bkz. Kuralları modelindeki değişiklikleri yaymak.

Kullanıcının özgün olaydan ayrı olarak ek güncelleştirmeleri geri isterseniz deposuna ek güncelleştirmeler yapmak için bir olay işleyicisi kullanabilirsiniz.Örneğin, küçük harf karakterler için albüm başlıklarını normal yönteme olduğunu varsayalım.Kullanıcı büyük harfle yazılmış sonra küçük harflere hitap gideren bir mağaza olay işleyicisi yazabilirsiniz.Ancak kullanıcı belgenize yapacağınız düzeltmeyi büyük harf geri yüklemeyi iptal etmek için Geri Al komutunu kullanabilirsiniz.İkinci geri alma kullanıcının değişiklik kaldırır.

Aynı şeyi yapmak için bir depo kural yazdıysanız, böylece kullanıcı ayarlama özgün değişikliği kaybetmeden geri alamadı Bunun aksine, kullanıcının değişiklik ve düzeltmenizi aynı işlemde olacaktır.

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

Bir olay yazarsanız, mağaza güncelleştirir:

  • Use store.InUndoRedoOrRollback modeli öğeleri geri alma değişiklik yapmasını önlemek için.Hareket Yöneticisi her şeyi deposuna özgün durumuna ayarlamak.

  • Use store.InSerializationTransaction model dosyasından yüklenirken değişiklikler yapmasını önlemek için.

  • Değişikliklerinizi başka olayların harekete neden olur.Sonsuz bir döngüye kaçınmak emin olun.

Olay türlerini depolamak

Store.EventManagerDirectory koleksiyonunda her olay türüne karşılık gelir.Eklemek ya da herhangi bir anda olay işleyicileri kaldırmak, ancak belge yüklendiğinde eklemek için normal.

EventManagerDirectoryÖzellik adı

Ne zaman yürütülen

ElementAdded

Etki alanı sınıf, etki alanı ilişkisi, Şekil, bağlayıcı veya diyagram örneği oluşturulur.

ElementDeleted

Modeli öğe mağazanın öğesi dizinden kaldırılmış ve kaynak veya hedef herhangi bir ilişkinin artık değil.Öğe aslında bellekten silinmez, ancak gelecekteki bir geri alma durumunda korunur.

ElementEventsBegun

Dış bir işlemin sonunda çağırdı.

ElementEventsEnded

Tüm olayları işlendiğinde çağırdı.

ElementMoved

Modeli öğe bir mağaza bölümünden diğerine taşındı.

Bu diyagram üzerinde bir şeklin konumunu ilişkili değildir.

ElementPropertyChanged

Bir etki alanı özelliğinin değeri değişmiştir.Sadece eski ve yeni değerler eşit olduğunda yürütülür.

RolePlayerChanged

Bir ilişkinin (sonu) iki rolden birini yeni bir öğe başvuruyor.

RolePlayerOrderChanged

Sırasından 1'den büyük çoklu bir rolde bağlantıların sırası değişti.

TransactionBeginning

TransactionCommitted

TransactionRolledBack

Ayrıca bkz.

Diğer Kaynaklar

Yanıtlama ve değişiklikleri yayılıyor

Örnek kod: devre diyagramları