Değişiklikleri Modelin Dışına Yayan Olay İşleyicileri
Görselleştirme ve Modelleme SDK'sında depo dışı değişkenler, dosyalar, diğer depolardaki modeller veya diğer Visual Studio uzantıları gibi değişiklikleri depo dışındaki kaynaklara yaymak için depolama olay işleyicileri tanımlayabilirsiniz. Depolama olay işleyicileri, tetikleme olayının gerçekleştiği işlem sona erdikten sonra yürütülür. Ayrıca bir Geri Al veya Yinele işleminde de yürütülürler. Bu nedenle, mağaza kurallarının aksine, mağaza olayları en çok mağaza dışındaki değerleri güncelleştirmek için yararlıdır. .NET olaylarından farklı olarak, depolama olay işleyicileri bir sınıfı dinlemek için kaydedilir: her örnek için ayrı bir işleyici kaydetmeniz gerekmez. Değişiklikleri işlemenin farklı yolları arasında seçim yapma hakkında daha fazla bilgi için bkz . Değişiklikleri Yanıtlama ve Yayma.
Grafik yüzey ve diğer kullanıcı arabirimi denetimleri, depolama olayları tarafından işlenebilen dış kaynaklara örnektir.
Bir mağaza olayı tanımlamak için
İzlemek istediğiniz olay türünü seçin. Tam liste için özelliklerine EventManagerDirectorybakın. Her özellik bir olay türüne karşılık gelir. En sık kullanılan olay türleri şunlardır:
ElementAdded
- model öğesi, ilişki bağlantısı, şekil veya bağlayıcı oluşturulduğunda tetikleniyor.ElementPropertyChanged - bir
Normal
etki alanı özelliğinin değeri değiştirildiğinde tetiklenir. Olay yalnızca yeni ve eski değerler eşit değilse tetiklenir. Olay, hesaplanan ve özel depolama özelliklerine uygulanamaz.İlişki bağlantılarına karşılık gelen rol özelliklerine uygulanamaz. Bunun yerine, etki alanı ilişkisini izlemek için kullanın
ElementAdded
.ElementDeleted
- bir model öğesi, ilişki, şekil veya bağlayıcı silindikten sonra tetiklendi. Öğenin özellik değerlerine yine de erişebilirsiniz, ancak diğer öğelerle ilişkisi olmaz.
DslPackage projesindeki ayrı bir kod dosyasına YourDslDocData için kısmi bir sınıf tanımı ekleyin.
Aşağıdaki örnekte olduğu gibi olayın kodunu bir yöntem olarak yazın. erişmek
DocData
istemediğiniz sürece olabilirstatic
.İşleyiciyi kaydetmek için geçersiz kılın
OnDocumentLoaded()
. Birden fazla işleyiciniz varsa, hepsini aynı yere kaydedebilirsiniz.
Kayıt kodunun konumu 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);
}
}
}
Mağaza'da Geri Alınamaz Ayarlamalar Yapmak için Olayları Kullanma
Olay işleyicisi işlem işlendikten sonra yürütülür çünkü depolama olayları normalde depo içindeki değişiklikleri yaymak için kullanılmaz. Bunun yerine bir mağaza kuralı kullanırsınız. Daha fazla bilgi için bkz . Kurallar Model İçinde Değişiklikleri Yayma.
Ancak, kullanıcının ek güncelleştirmeleri özgün olaydan ayrı olarak geri alabilmesini istiyorsanız, depoda ek güncelleştirmeler yapmak için olay işleyicisi kullanabilirsiniz. Örneğin, küçük harf karakterlerinin albüm başlıkları için normal kural olduğunu varsayalım. Kullanıcı büyük harfe yazdıktan sonra başlığı küçük harfe düzelten bir depo olay işleyicisi yazabilirsiniz. Ancak kullanıcı düzeltmenizi iptal etmek ve büyük harf karakterlerini geri yüklemek için Geri Al komutunu kullanabilir. İkinci bir Geri Alma işlemi kullanıcının değişikliğini kaldırır.
Buna karşılık, aynı işlemi yapmak için bir mağaza kuralı yazdıysanız, kullanıcının değişikliği ve düzeltmeniz aynı işlemde olur, böylece kullanıcı özgün değişikliği kaybetmeden ayarlamayı geri alamaz.
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.
}
Depoyu güncelleştiren bir olay yazarsanız:
Geri Al'da model öğelerinde değişiklik yapmaktan kaçınmak için kullanın
store.InUndoRedoOrRollback
. İşlem yöneticisi, depodaki her şeyi özgün durumuna geri ayarlar.Model dosyadan yüklenirken değişiklik yapmaktan kaçınmak için kullanın
store.InSerializationTransaction
.Değişiklikleriniz başka olayların tetiklenmesine neden olur. Sonsuz bir döngüden kaçındığınızdan emin olun.
Olay türlerini depolama
Her olay türü Store.EventManagerDirectory'deki bir koleksiyona karşılık gelir. İstediğiniz zaman olay işleyicileri ekleyebilir veya kaldırabilirsiniz, ancak belge yüklendiğinde bunları eklemek normaldir.
EventManagerDirectory Özellik adı |
Yürütülürken |
---|---|
Elementadded | Bir etki alanı sınıfı, etki alanı ilişkisi, şekil, bağlayıcı veya diyagram örneği oluşturulur. |
ElementDeleted | Model öğesi deponun öğe dizininden kaldırılmıştır ve artık herhangi bir ilişkinin kaynağı veya hedefi değildir. öğesi aslında bellekten silinmez, ancak gelecekte geri alma durumunda korunur. |
ElementEventsBegun | Dış işlemin sonunda çağrılır. |
ElementEventsEnded | Diğer tüm olaylar işlendiğinde çağrılır. |
ElementMoved | Model öğesi bir depo bölümünden diğerine taşındı. Bu, bir şeklin diyagramdaki konumuyla ilgili değildir. |
ElementPropertyChanged | Etki alanı özelliğinin değeri değişti. Bu yalnızca eski ve yeni değerler eşit değilse yürütülür. |
RolePlayerChanged | bir ilişkinin iki rolünden (sonu) biri yeni bir öğeye başvurur. |
RolePlayerOrderChanged | Çokluğu 1'den büyük olan bir rolde, bağlantı dizisi değişti. |
TransactionBeginning | |
TransactionCommitted | |
TransactionRolledBack |
İlgili içerik
Not
Metin Şablonu Dönüştürme bileşeni, Visual Studio uzantısı geliştirme iş yükünün bir parçası olarak otomatik olarak yüklenir. Ayrıca Visual Studio Yükleyicisi Tek tek bileşenler sekmesinden SDK'lar, kitaplıklar ve çerçeveler kategorisinin altından da yükleyebilirsiniz. Tek tek bileşenler sekmesinden Modelleme SDK'sı bileşenini yükleyin.