Gezinme ve Program kodunda bir modeli güncelleştiriliyor
Modeli öğeleri sil, bunların özelliklerini ayarlamak ve oluşturulur ve öğeleri arasındaki bağlantıları silmek için kod yazabilirsiniz.Tüm değişiklikleri bir hareket içinde yapılması gerekir.Öğe bir çizim görüntülerse, Diyagram "otomatik olarak işlemin sonunda giderilecektir".
Bu konuda
Örneğin dsl tanımı
Model gezinme
Sınıf bilgilerine erişme
Hareketteki değişiklikleri gerçekleştirme
Modeli öğeler oluşturma
İlişki bağlantılar oluşturma
Öğeleri silme
İlişki bağlantılarını silme
Bir ilişkinin bağlantıları yeniden sıralama
Kilitleri
Kopyala ve Yapıştır
Gezinme ve diyagramları güncelleştiriliyor
Şekiller ve öğeleri arasında gezinme
Özelliklerinin şekilleri ve bağlayıcıları
DocView ve DocData
Şekiller, bağlayıcılar ve diyagramları ve ilişkilerini modeli öğeler için ayrı bir bölümde açıklanmıştır.Daha fazla bilgi için bkz. [yönlendirme] Nasıl yapılır: gidin ve bir diyagram Güncelleştir.
Örneğin dsl tanımı
Bu ana DslDefinition.dsl için bu konudaki örneklerde parçasıdır:
Bu model, bu dsl örneğidir:
Başvurular ve ad alanları
Bu konudaki kod çalıştırmak için başvuru:
Microsoft.VisualStudio.Modeling.Sdk.11.0.dll
Kodunuzu bu ad alanı kullanır:
using Microsoft.VisualStudio.Modeling;
Buna ek olarak, dsl tanımlı olandan başka bir proje kodu yazıyorsanız, Dsl project tarafından oluşturulan derlemenin almanız gerekir.
Model gezinme
Özellikler
dsl tanımında tanımlamak etki alanı özellikleri program kodunda erişebilirsiniz özellikleri haline gelir:
Person henry = ...;
if (henry.BirthDate < 1500) ...
if (henry.Name.EndsWith("VIII")) ...
Bir özelliği ayarlamak isterseniz, bunu içinde yapmanız gerekir bir hareket:
henry.Name = "Henry VIII";
Eğer dsl tanımının, bir özelliği de tür olan hesaplanan, ayarlayamazsınız.Daha fazla bilgi için bkz. Hesaplanan ve özel depolama özellikleri.
İlişkiler
dsl tanımında tanımlayan ilişkiler etki alanı bir ilişkinin her iki ucunda sınıf özellik çiftleri haline gelir.Özellik adlarını DslDefinition şemada roller her tarafında ilişki etiketleri olarak görüntülenir.Rol iþlenenlerle bağlı olarak, özelliği ilişkinin diğer uçta sınıfı veya o sınıfın bir koleksiyon türüdür.
foreach (Person child in henry.Children) { ... }
FamilyTreeModel ftree = henry.FamilyTreeModel;
Ters İlişki ucundaki özellikleri her zaman, devrik.Bir bağlantı oluşturulduğunda veya silindiğinde, her iki öğe rolü özellikleri güncelleştirilir.Aşağıdaki deyim (uzantılarını kullanır System.Linq) her zaman için örnek ParentsHaveChildren ilişkisinde geçerlidir:
(Person p) => p.Children.All(child => child.Parents.Contains(p))
&& p.Parents.All(parent => parent.Children.Contains(p));
ElementLinks.Bir ilişki adlı bir model öğesi tarafından temsil edilen bir bağlantı, etki alanı ilişki türünün bir örneği olduğu.Bir bağlantı her zaman bir kaynak öğesi ve bir hedef öğe vardır.Kaynak öğesinde ve hedef öğe aynı olabilir.
Bağlantı ve özelliklerine erişebilirsiniz:
ParentsHaveChildren link = ParentsHaveChildren.GetLink(henry, edward);
// This is now true:
link == null || link.Parent == henry && link.Child == edward
Varsayılan olarak, birden fazla örneğini bir ilişki modeli öğeleri herhangi bir çift bağlantı izin verilir.Ancak dsl tanımı ise, Allow Duplicates bayrağı ilişkisi için doğru ise, birden fazla bağlantı olabilir ve kullanmanız gerekir GetLinks:
foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinks(henry, edward)) { ... }
Bağlantıları erişmek için diğer yöntemleri de vardır.Örne?in:
foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinksToChildren(henry)) { ... }
Gizli rolleri. dsl tanımında ise, Özellik oluşturulur olan yanlış belirli bir rol için sonra hiçbir özelliği bu role karşılık gelen oluşturulur.Ancak, yine de bağlantılar erişebilir ve ilişki yöntemleri kullanarak bağlantılar:
foreach (Person p in ParentsHaveChildren.GetChildren(henry)) { ... }
En sık kullanılan örnek PresentationViewsSubject modeli öğe üzerinde bir diyagram görüntüler şekli bağlar ilişki:
PresentationViewsSubject.GetPresentation(henry)[0] as PersonShape
Öğe dizini
Öğe dizini kullanarak deposundaki tüm öğeleri erişebilirsiniz:
store.ElementDirectory.AllElements
Aşağıdaki gibi öğeleri bulmak için kullanılan yöntemlerin vardır:
store.ElementDirectory.FindElements(Person.DomainClassId);
store.ElementDirectory.GetElement(elementId);
Sınıf bilgilerine erişme
Sınıflar, ilişkileri ve dsl tanımı diğer yönleri hakkında bilgi edinebilirsiniz.Örne?in:
DomainClassInfo personClass = henry.GetDomainClass();
DomainPropertyInfo birthProperty =
personClass.FindDomainProperty("BirthDate")
DomainRelationshipInfo relationship =
link.GetDomainRelationship();
DomainRoleInfo sourceRole = relationship.DomainRole[0];
Modeli öğeleri ata sınıfları aşağıdaki gibidir:
ModelElement - tüm öğeleri ve ilişkileri olan ModelElements
ElementLink - ElementLinks tüm ilişkileri olan
Hareketteki değişiklikleri gerçekleştirme
Program kodunuzu deposundaki bir şey değiştiğinde bunu bir işlem içinde yapmalısınız.Bu, tüm modeli öğeleri, ilişkilerini, şekiller, diyagramları ve bunların özelliklerini geçerlidir.Daha fazla bilgi için bkz. Transaction.
Bir hareket yönetmenin en uygun yöntem olan bir using deyimi içine bir try...catch ifadesi:
Store store; ...
try
{
using (Transaction transaction =
store.TransactionManager.BeginTransaction("update model"))
// Outermost transaction must always have a name.
{
// Make several changes in Store:
Person p = new Person(store);
p.FamilyTreeModel = familyTree;
p.Name = "Edward VI";
// end of changes to Store
transaction.Commit(); // Don't forget this!
} // transaction disposed here
}
catch (Exception ex)
{
// If an exception occurs, the Store will be
// rolled back to its previous state.
}
Herhangi bir sayıda bir hareket içinde değişiklik yapabilirsiniz.Etkin bir işlem içinde yeni hareketler açabilirsiniz.
Yaptığınız değişiklikleri kalıcı hale getirmek için şunları yapmalısınız: Commit , atılmadan önce hareket.İşlem içinde yakalanan olmayan bir özel durum oluþursa, deposu değişikliklerden önce durumuna sıfırlanır.
Modeli öğeler oluşturma
Bu örnek, varolan bir modeli bir öğe ekler:
FamilyTreeModel familyTree = ...; // The root of the model.
using (Transaction t =
familyTree.Store.TransactionManager
.BeginTransaction("update model"))
{
// Create a new model element
// in the same partition as the model root:
Person edward = new Person(familyTree.Partition);
// Set its embedding relationship:
edward.FamilyTreeModel = familyTree;
// same as: familyTree.People.Add(edward);
// Set its properties:
edward.Name = "Edward VII";
t.Commit(); // Don't forget this!
}
Bu örnekte, öğe oluşturma hakkında bu önemli noktaları gösterilmektedir:
Yeni öğe belirli bir depo bölümünde oluşturun.Modeli öğeleri ve ilişkileri ancak şekilleri değil, genellikle varsayılan bölüm budur.
Gömme bir ilişkinin hedef sağlamak.Bu örneğin DslDefinition, her kişinin ilişki FamilyTreeHasPeople gömme hedef olmalıdır.Bunun için biz kişi nesnesinin FamilyTreeModel rol özelliğini ayarlamak veya kişinin FamilyTreeModel nesnesinin kişilerin rolü özelliğine ekleyin.
Özellik özellikle kendisi için yeni bir öğe özelliklerini IsName DslDefinition içinde geçerlidir.Bu bayrak, öğenin sahibi içinde benzersiz olarak tanımlanmasını sağlar özelliği işaretler.Bu durumda, Name özelliği, bu bayrağı vardır.
Bu dsl dsl tanımı deposuna yüklenmiş olmalıdır.Bir menü komutu gibi bir uzantı yazıyorsanız, bu genellikle zaten doğru olacaktır.Diğer durumlarda açık deposuna modeli, veya kullanmak ModelBus bunu yüklemek için.Daha fazla bilgi için bkz. Nasıl yapılır: Program kod dosyasından Model Aç.
Bu şekilde bir öğe oluşturduğunuzda, (dsl bir diyagram varsa) şeklinde otomatik olarak oluşturulur.Varsayılan Şekil, renk ve diğer özellikleri otomatik olarak atanan bir konumda görünür.Nereye ve nasıl ilişkili şekli görünür denetlemek istiyorsanız bkz: bir öğe ve şeklini oluşturma.
İlişki bağlantılar oluşturma
dsl tanım örnekte tanımlanan iki ilişkileri vardır.Her ilişki tanımlar bir rolü özelliği sınıfı ilişkinin her iki ucunda.
Bir ilişkinin bir örneği oluşturmanın üç yolu vardır.Üç bu yöntemlerin her biri, aynı etkiye sahiptir:
Kaynak rolü player özelliğini ayarlayın.Örne?in:
familyTree.People.Add(edward);
edward.Parents.Add(henry);
Hedef rol player özelliğini ayarlayın.Örne?in:
edward.familyTreeModel = familyTree;
Bu rol iþlenenlerle olan 1..1, böylece biz değerini atayın.
henry.Children.Add(edward);
Bu rol iþlenenlerle olan 0..*, biz koleksiyonuna eklemek için.
Açıkça ilişkinin bir örneğini oluşturun.Örne?in:
FamilyTreeHasPeople edwardLink = new FamilyTreeHasPeople(familyTreeModel, edward);
ParentsHaveChildren edwardHenryLink = new ParentsHaveChildren(henry, edward);
En son yöntem, ilişkinin kendisini özelliklerini ayarlamak istiyorsanız, yararlıdır.
Bu şekilde bir öğe oluşturduğunuzda, bir bağlayıcı Diyagram üzerinde otomatik olarak oluşturulur, ancak varsayılan şekil, renk ve diğer özellikleri vardır.İlişkili bağlayıcı nasıl oluşturulduğunu kontrol etmek için bkz: bir öğe ve şeklini oluşturma.
Öğeleri silme
Çağırarak bir öğe silmek Delete():
henry.Delete();
Bu işlem de silinmesine neden olur:
İlişki bağlantıları ve öğeden.Örneğin, edward.Parents artık içerecek henry.
Öğeleri hangi için roller en PropagatesDelete bayrağı doğrudur.Örneğin, öğe görüntüler Şekil silinir.
Varsayılan olarak, her gömme ilişkisine sahip PropagatesDelete hedef rolü true.Silme henry silme familyTree, ama familyTree.Delete() tümünü silmek Persons.Daha fazla bilgi için bkz. Silme davranışı özelleştirme.
Varsayılan olarak, PropagatesDelete başvuru ilişki rolleri için geçerli değildir.
Bir nesneyi sildiğinizde, özel yayılma atlamak silme kuralları neden olabilir.Bunun için başka bir öğe yerine yararlıdır.GUID için silme değil yayılması bir veya daha fazla rol sağlayın.GUID ilişki sınıfından elde edilebilir:
henry.Delete(ParentsHaveChildren.SourceDomainRoleId);
(Çünkü bu belirli örnek herhangi bir etkisi yoktur PropagatesDelete olan false rolleri için ParentsHaveChildren ilişkisi.)
Bazı durumlarda, silme, lock öğesinin veya yayma tarafından silinecek kayıtlardan bir öğe varlığını tarafından engellenir.Kullanabileceğiniz element.CanDelete() öğesi silinmiş olup olmadığını denetlemek için.
İlişki bağlantılarını silme
Rol özelliğinden bir öğeyi kaldırarak bir ilişki bağlantıyı silebilirsiniz:
henry.Children.Remove(edward); // or:
edward.Parents.Remove(henry); // or:
Bağlantıyı açıkça de silebilirsiniz:
edwardHenryLink.Delete();
Tüm bu üç yöntem aynı etkiye sahiptir.Bunlardan birini kullanmak yeterlidir.
Rol 0..1 veya 1..1 multiplicity varsa ayarlayabilirsiniz null, ya da başka bir değer:
edward.FamilyTreeModel = null;/ / veya:
edward.FamilyTreeModel = anotherFamilyTree;
Bir ilişkinin bağlantıları re-ordering
Belirli bir sıra bağlantılar kaynaklanan veya belirli bir modeli öğede hedeflenmiş belirli bir ilişki vardır.Eklenmiş olan sırada görünürler.Örneğin, bu ifade aynı sırada çocuklar her zaman sonucunu verir:
foreach (Person child in henry.Children) ...
Bağlantıların sırasını değiştirebilirsiniz:
ParentsHaveChildren link = GetLink(henry,edward);
ParentsHaveChildren nextLink = GetLink(henry, elizabeth);
DomainRoleInfo role =
link.GetDomainRelationship().DomainRoles[0];
link.MoveBefore(role, nextLink);
Kilitleri
Değişikliklerinizi kilit tarafından engellenebilir.Kilitleri tek tek öğeleri, bölümler ve mağaza ayarlayabilirsiniz.Bu düzeyleri birini yapmak istediğiniz değişiklik türünü engelleyen bir kilit varsa, onu çalıştığınızda bir özel durum.Kilit öğesi kullanılarak ayarlanıp ayarlanmadığını bulabilir.Tanımlanan bir uzantısı yöntemi olan GetLocks() Immutability.
Daha fazla bilgi için bkz. Salt okunur segmentleri oluşturmak için bir kilitleme ilkesi tanımlama.
Kopyala ve Yapıştır
Öğeleri veya öğe gruplarını kopyalayabilirsiniz bir IDataObject:
Person person = personShape.ModelElement as Person;
Person adopter = adopterShape.ModelElement as Person;
IDataObject data = new DataObject();
personShape.Diagram.ElementOperations
.Copy(data, person.Children.ToList<ModelElement>());
Öğeleri bir serileştirilmiş öğe grubu olarak depolanır.
Bir IDataObject'i öğelerden bir modele birleştirebilirsiniz:
using (Transaction t = targetDiagram.Store.
TransactionManager.BeginTransaction("paste"))
{
adopterShape.Diagram.ElementOperations.Merge(adopter, data);
}
Merge ()ya da alabilen bir PresentationElement veya bir ModelElement.Bunu, bir PresentationElement, üçüncü bir parametre olarak hedef Diyagram üzerinde bir konum belirtebilirsiniz.
Gezinme ve diyagramları güncelleştiriliyor
dsl, kişi veya şarkı gibi bir kavramı temsil eder, etki alanı modeli öğe gösteren Diyagram üzerinde bkz: Şekil öğesi farklıdır.Etki alanı modeli öğe ilişkileri kavramı ve önemli özelliklerini saklar.Şekli öğenin boyutunu, konumunu ve Diyagramı'nda nesnenin görünümü rengi ve bileşen parçalarının düzenini saklar.
Sunu öğeleri
dsl tanımınızı belirlediğiniz her öğe, aşağıdaki standart sınıflarının birinden türetilmiş bir sınıf oluşturur.
Öğe türü |
Temel sınıf |
---|---|
Etki alanı sınıfı |
|
Etki alanı ilişkisi |
|
Şekil |
|
Bağlayıcı |
|
Diyagram |
Bir diyagram bir öğe genellikle bir modeli öğesini temsil eder.Genellikle (ama her zaman değil), bir NodeShape bir etki alanı sınıf örneğini temsil eder ve bir BinaryLinkShape etki alanı ilişkisi örneği temsil eder.PresentationViewsSubject İlişki temsil ettiği modeli öğe düğümü veya bağlantı şekli bağlar.
Her düğüm veya bağlantı şekli bir diyagram aittir.İkili bağlantı şeklinde iki düğüm şekilleri bağlanır.
Şekiller iki alt şekilleri olabilir.Bir şekil NestedChildShapes ayarlamak için sınırlayıcı kutunun üst öğesinin sınırlandırılan.Bir şekil RelativeChildShapes liste dışında veya kısmen üst – bir etiket veya bağlantı noktası sınırları dışında görüntülenebilir.Hayır bir diyagram olan RelativeChildShapes ve hiç Parent.
Şekiller ve öğeleri arasında gezinme
Etki alanı modeli öğeleri ve Şekil öğeleri ilgili olarak PresentationViewsSubject ilişkisi.
// using Microsoft.VisualStudio.Modeling;
// using Microsoft.VisualStudio.Modeling.Diagrams;
// using System.Linq;
Person henry = ...;
PersonShape henryShape =
PresentationViewsSubject.GetPresentation(henry)
.FirstOrDefault() as PersonShape;
Aynı İlişki Diyagramı'nda bağlayıcılar ilişkileri bağlar:
Descendants link = Descendants.GetLink(henry, edward);
DescendantConnector dc =
PresentationViewsSubject.GetPresentation(link)
.FirstOrDefault() as DescendantConnector;
// dc.FromShape == henryShape && dc.ToShape == edwardShape
Bu ilişki modelinin kök diyagrama da bağlar:
FamilyTreeDiagram diagram =
PresentationViewsSubject.GetPresentation(familyTree)
.FirstOrDefault() as FamilyTreeDiagram;
Şekil tarafından temsil edilen modeli öğesini almak için aşağıdaki komutu kullanın:
henryShape.ModelElement as Person
diagram.ModelElement as FamilyTreeModel
Diyagram dolaşma
Genel olarak şekilleri ve bağlayıcıları Diyagramı'nda arasında gezinmek için tavsiye değil.İlişkilerini, yalnızca Diyagramı görünümü üzerinde çalışmak gerekli olduğunda şekilleri ve bağlayıcıları arasında taşıma modeli, giderek daha iyidir.Bu yöntemler bağlayıcılar şekilleri her iki ucunda bağlayın:
personShape.FromRoleLinkShapes, personShape.ToRoleLinkShapes
connector.FromShape, connector.ToShape
Birçok Şekil bileşikler şunlardır; Bunlar üst şekil ve bir veya daha fazla alt katmanlarından oluşur.Başka bir şekle göre konumlandırılmış şekiller olarak Kısacası kendi Çocuklar.Üst şekil taşındığında, çocukların birlikte taşınır.
Göreli çocuklar üst şeklinin sınırlayıcı kutunun dışında görünebilir.İç içe alt üst sınırları içinde kesinlikle görünür.
Şekiller bir Diyagram üzerinde üst kümesi elde etmek için aşağıdaki komutu kullanın:
Diagram.NestedChildShapes
Şekilleri ve bağlayıcıları ata sınıfları şunlardır:
-- ShapeElement
----- NodeShape
------- Diagram
------- YourShape
----- LinkShape
------- BinaryLinkShape
--------- YourConnector
Özelliklerinin şekilleri ve bağlayıcıları
Çoğu durumda, şekillere açık değişiklik yapmak gerekli değildir.Modeli öğeler değiştiğinde, "Düzelt" kuralları şekilleri ve bağlayıcıları güncelleştirin.Daha fazla bilgi için bkz. Yanıtlama ve değişiklikleri yayılıyor.
Ancak, şekilleri modeli öğeleri bağımsız özellikleri açık bazı değişiklikler yapmak yararlıdır.Örneğin, bu özellikleri değiştirebilir:
Size-şeklin genişliği ve yüksekliği belirler.
Location-üst Şekil veya diyagram göreceli konuma
StyleSet-kalemler ve Şekil veya bağlayıcı çizme için kullanılan fırçaları kümesini
Hide-Şekil görünmez hale getirir
Show-Şekil sonra görünür hale getirir birHide()
Bir öğe ve onun Şekil oluşturma
Bir öğe oluşturun ve ilişkilerin katıştırma ağacına bağlanma şeklinde otomatik olarak oluşturulan ve onunla ilişkili.Bu işlemin sonunda Yürüt "düzeltme" kuralları tarafından yapılır.Ancak, Şekil otomatik olarak atanan bir konumda görünür ve şeklini, rengini ve diğer özellikleri varsayılan değerleri olacaktır.Şekli nasıl oluşturulduğunu kontrol etmek için birleştirme işlevini kullanabilirsiniz.Önce bir ElementGroup eklemek istediğiniz öğeleri ekleyin ve sonra grup diyagramı ile birleştirmek gerekir.
Bu yöntem:
Bir özellik olarak öğe adı atadıysanız, adını ayarlar.
Herhangi bir öğenin birleştirme dsl tanımında belirtilen yönergeleri gözlemliyorsa.
Diyagram kullanıcı tıklattığında bu örnek fare konumda bir şekil oluşturur.Bu örnek için dsl tanımında FillColor özelliðinin ExampleShape sergilenen.
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
partial class MyDiagram
{
public override void OnDoubleClick(DiagramPointEventArgs e)
{
base.OnDoubleClick(e);
using (Transaction t = this.Store.TransactionManager
.BeginTransaction("double click"))
{
ExampleElement element = new ExampleElement(this.Store);
ElementGroup group = new ElementGroup(element);
{ // To use a shape of a default size and color, omit this block.
ExampleShape shape = new ExampleShape(this.Partition);
shape.ModelElement = element;
shape.AbsoluteBounds = new RectangleD(0, 0, 1.5, 1.0);
shape.FillColor = System.Drawing.Color.Azure;
group.Add(shape);
}
this.ElementOperations.MergeElementGroupPrototype(
this,
group.CreatePrototype(),
PointD.ToPointF(e.MousePosition));
t.Commit();
}
}
}
Birden fazla şekli sağlarsanız, ilgili konumlarını kullanarak ayarlamak AbsoluteBounds.
Ayrıca, renk ve diğer özellik uçlarının bu yöntemi kullanarak da ayarlayabilirsiniz.
Hareketleri kullanma
Şekilleri ve bağlayıcıları diyagramları alt türlerinden biri olan ModelElement ve canlı deposunda.Bu nedenle değişiklikleri için yalnızca bir işlem içinde yapmanız gerekir.Daha fazla bilgi için bkz. Nasıl yapılır: modeli güncelleştirmek için hareketleri kullanın..
Belge görünümü ve belge veri
Depo bölümleri
Bir modeli yüklendiğinde, beraberindeki Diyagram aynı zamanda yüklenir.Genellikle, modeli Store.DefaultPartition yüklenir ve Diyagram içeriği başka bir bölüme yüklenir.Genellikle, her bölümünün içerik yüklenir ve ayrı bir dosyaya kaydedilir.
Ayrıca bkz.
Başvuru
Kavramlar
Bir etki alanına özgü dil doğrulama
Nasıl yapılır: modeli güncelleştirmek için hareketleri kullanın.
Modelleri Visual Studio Modelbus kullanarak tümleştirme