Programy obsługi zdarzeń propagowanie zmian poza modelu
W wizualizacji i modelowania SDK, można zdefiniować obsługi zdarzeń magazynu propagowanie zmian zasobów poza magazynu, takich jak zmienne-store, pliki modeli w innych sklepach lub innych Visual Studio rozszerzeń.Programy obsługi zdarzeń magazynu są wykonywane po zakończeniu transakcji, w którym wyzwalającego zdarzenie miało miejsce.Są one wykonywane również w przypadku operacji Cofnij i ponów.W związku z tym w przeciwieństwie do reguł magazynu zdarzenia magazynu są najbardziej użyteczne w przypadku aktualizowania wartości, które są poza magazynu.W odróżnieniu od.Zarejestrowane zdarzenia netto, programy obsługi zdarzeń magazynu słuchać klasy: nie trzeba zarejestrować osobne obsługi dla każdego wystąpienia.Aby uzyskać więcej informacji na temat wyboru między różne sposoby obsługi zmian, zobacz Reagowanie na i propagowanie zmian.
Powierzchnia graficznych i innych formantów interfejsu użytkownika są przykładami zasobów zewnętrznych, które mogą być obsługiwane przez zdarzenia magazynu.
Aby zdefiniować zdarzenia magazynu
Wybierz typ zdarzenia, które chcesz monitorować.Aby uzyskać pełną listę, spójrz na właściwości EventManagerDirectory.Każda właściwość odpowiada typ zdarzenia.Najczęściej używane zdarzenie, które typy są:
ElementAdded– wyzwalane, gdy element modelu, łącze relacji, łącznik lub kształt jest tworzony.
ElementPropertyChanged – wyzwalane, gdy wartość Normal właściwość domeny zostanie zmieniona.Zdarzenie jest wywoływane tylko wtedy, gdy nowe i stare wartości nie są równe.Zdarzenie nie można zastosować do właściwości magazynu obliczeniowe i niestandardowe.
Każde pozwolenie na wywóz nie można zastosować do właściwości roli, które odpowiadają łącza relacji.Zamiast tego należy użyć ElementAdded do monitorowania relacji domeny.
ElementDeleted– wyzwalane po elementu modelu, relacji, łącznik lub kształt został usunięty.Nadal można uzyskać dostęp do wartości właściwości elementu, ale będzie miała nie relacje z innymi elementami.
Dodawanie definicji częściowej klasy dla YourDslDocData w pliku osobnego kodu w DslPackage projektu.
Napisać kod zdarzenia jako metody, jak w poniższym przykładzie.Można je static, chyba że chcesz uzyskać dostęp do DocData.
Zastąpić OnDocumentLoaded() zarejestrować programu obsługi.Jeśli masz więcej niż jeden program obsługi, można zarejestrować je w tym samym miejscu.
Położenie kodu rejestracji nie jest krytyczna.DocView.LoadView()jest alternatywnej lokalizacji.
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);
}
}
}
Można cofnąć zmiany w magazynie za pomocą zdarzenia
Zdarzenia magazynu nie są zwykle używane dla materiału rozmnożeniowego zmiany wewnątrz magazynu, ponieważ obsługa zdarzeń jest wykonywany po transakcja została zatwierdzona.Zamiast tego czy użyć reguły magazynu.Aby uzyskać więcej informacji, zobacz Zasady propagowanie zmian w ramach modelu.
Może jednak użyć programu obsługi zdarzeń dokonanie dodatkowych aktualizacji w magazynie, jeśli chcesz, aby użytkownik mógł cofnąć dodatkowe aktualizacje niezależnie od oryginalnej zdarzenia.Na przykład załóżmy, że małe litery, znaki są standardowej Konwencji dla tytułów albumów.Można napisać obsługi zdarzenia magazynu, która naprawia tytuł na małe litery po użytkownik wpisał on pisany wielkimi literami.Jednak użytkownik może wykonać polecenia Cofnij i aby anulować poprawkę, przywracanie wielkich liter.Cofnij drugi spowoduje usunięcie zmian przez użytkownika.
Z drugiej strony Jeśli napisał reguła magazynu, aby zrobić to samo użytkownika zmiany i poprawki byłoby w tej samej transakcji, dzięki czemu użytkownik nie może cofnąć bez utraty zmiany oryginalnego korekty.
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 zapis jest zdarzenie, które aktualizacje magazynu:
Użyj store.InUndoRedoOrRollback unikać dokonywania zmian do cofania elementów modelu.Menedżer transakcji zostanie ustawiona, wszystko w magazynie, wróć do oryginalnego stanu.
Użyj store.InSerializationTransaction unikać dokonywania zmian, podczas gdy model jest ładowany z pliku.
Zmiany spowoduje dalsze zdarzenia, które mają zostać wyzwolone.Upewnij się, że aby uniknąć nieskończoną pętlę.
Typy zdarzeń magazynu
Każdy typ zdarzenia odpowiada kolekcji w Store.EventManagerDirectory.Można dodawać lub usuwać programy obsługi zdarzeń w dowolnym momencie, ale jest zwykle je dodać, gdy dokument zostanie załadowany.
EventManagerDirectoryNazwa właściwości |
Kiedy wykonywany |
---|---|
ElementAdded |
Tworzone jest wystąpienie klasy domeny, relacji domen, kształt, łącznika lub diagramu. |
ElementDeleted |
Element modelu została usunięta z katalogu elementu magazynu i nie jest już źródłowego lub docelowego wszelkie relacje.Element nie jest faktycznie usuwany z pamięci, ale jest zachowywana w odniesieniu do przyszłych Cofnij. |
ElementEventsBegun |
Wywoływane z końcem transakcji zewnętrznych. |
ElementEventsEnded |
Wywoływana, gdy inne zdarzenia zostały przetworzone. |
ElementMoved |
Element modelu został przeniesiony z partycji z jednego magazynu do innego. Nie jest to związane z lokalizacji kształtu na diagramie. |
ElementPropertyChanged |
Zmieniła się wartość właściwości domeny.To jest wykonywane tylko wtedy, gdy nie są równe wartości stare i nowe. |
RolePlayerChanged |
Jedną z dwóch ról relacji (kończy się) odwołuje się do nowego elementu. |
RolePlayerOrderChanged |
W roli liczebność jest większa niż 1 zmieniła się kolejność łączy. |
TransactionBeginning |
|
TransactionCommitted |
|
TransactionRolledBack |