/// <summary>
        /// Constructor. This view model constructed with 'bHookUpEvents=true' does react on model changes.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        /// <param name="diagramTreeNode">Element represented by this view model.</param>
        protected DiagramTreeNodeViewModel(ViewModelStore viewModelStore, DiagramTreeNode diagramTreeNode)
            : base(viewModelStore, diagramTreeNode.PresentationElementClass)
        {
            this.diagramTreeNode = diagramTreeNode;

            if (this.DiagramTreeNode != null)
                if (this.DiagramTreeNode.PresentationElementClass != null)
                {
                    presentationElementClassId = this.DiagramTreeNode.PresentationElementClass.Id;

                    this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ShapeClassReferencesDomainClass.DomainClassId),
                        true, this.DiagramTreeNode.PresentationElementClass.Id, new Action<ElementAddedEventArgs>(OnShapeElementAdded));

                    this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ShapeClassReferencesDomainClass.DomainClassId),
                        true, this.DiagramTreeNode.PresentationElementClass.Id, new Action<ElementDeletedEventArgs>(OnShapeElementRemoved));

                    this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(ShapeClassReferencesDomainClass.DomainClassDomainRoleId),
                        new Action<RolePlayerChangedEventArgs>(OnShapeElementChanged));

                    this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(RelationshipShapeClassReferencesReferenceRelationship.DomainClassId),
                        true, this.DiagramTreeNode.PresentationElementClass.Id, new Action<ElementAddedEventArgs>(OnRSShapeElementAdded));

                    this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(RelationshipShapeClassReferencesReferenceRelationship.DomainClassId),
                        true, this.DiagramTreeNode.PresentationElementClass.Id, new Action<ElementDeletedEventArgs>(OnRSShapeElementRemoved));

                    this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(RelationshipShapeClassReferencesReferenceRelationship.DomainRelationshipDomainRoleId),
                        new Action<RolePlayerChangedEventArgs>(OnRSShapeElementChanged));

                    if (this.DiagramTreeNode.PresentationElementClass is RelationshipShapeClass)
                        AddRSShapeElement((this.DiagramTreeNode.PresentationElementClass as RelationshipShapeClass).ReferenceRelationship);
                    else
                        AddShapeElement((this.DiagramTreeNode.PresentationElementClass as PresentationDomainClassElement).DomainClass);
                }     
        }
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item is DiagramTreeNodeViewModel)
            {
                DiagramTreeNodeViewModel vm = item as DiagramTreeNodeViewModel;

                DiagramTreeNode node = vm.DiagramTreeNode;
                if (node.PresentationElementClass is MappingRelationshipShapeClass)
                {
                    return(MappingRelationshipClassTemplate);
                }
                else if (node.PresentationElementClass is ShapeClass)
                {
                    return(ShapeClassTemplate);
                }
                else if (node.PresentationElementClass is RelationshipShapeClass)
                {
                    return(RelationshipClassTemplate);
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// Constructor. This view model constructed with 'bHookUpEvents=true' does react on model changes.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        /// <param name="diagramTreeNode">Element represented by this view model.</param>
        protected DiagramTreeNodeViewModel(ViewModelStore viewModelStore, DiagramTreeNode diagramTreeNode)
            : base(viewModelStore, diagramTreeNode.PresentationElementClass)
        {
            this.diagramTreeNode = diagramTreeNode;

            if (this.DiagramTreeNode != null)
            {
                if (this.DiagramTreeNode.PresentationElementClass != null)
                {
                    presentationElementClassId = this.DiagramTreeNode.PresentationElementClass.Id;

                    this.EventManager.GetEvent <ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ShapeClassReferencesDomainClass.DomainClassId),
                                                                                        true, this.DiagramTreeNode.PresentationElementClass.Id, new Action <ElementAddedEventArgs>(OnShapeElementAdded));

                    this.EventManager.GetEvent <ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ShapeClassReferencesDomainClass.DomainClassId),
                                                                                          true, this.DiagramTreeNode.PresentationElementClass.Id, new Action <ElementDeletedEventArgs>(OnShapeElementRemoved));

                    this.EventManager.GetEvent <ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(ShapeClassReferencesDomainClass.DomainClassDomainRoleId),
                                                                                         new Action <RolePlayerChangedEventArgs>(OnShapeElementChanged));

                    this.EventManager.GetEvent <ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(RelationshipShapeClassReferencesReferenceRelationship.DomainClassId),
                                                                                        true, this.DiagramTreeNode.PresentationElementClass.Id, new Action <ElementAddedEventArgs>(OnRSShapeElementAdded));

                    this.EventManager.GetEvent <ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(RelationshipShapeClassReferencesReferenceRelationship.DomainClassId),
                                                                                          true, this.DiagramTreeNode.PresentationElementClass.Id, new Action <ElementDeletedEventArgs>(OnRSShapeElementRemoved));

                    this.EventManager.GetEvent <ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(RelationshipShapeClassReferencesReferenceRelationship.DomainRelationshipDomainRoleId),
                                                                                         new Action <RolePlayerChangedEventArgs>(OnRSShapeElementChanged));

                    if (this.DiagramTreeNode.PresentationElementClass is RelationshipShapeClass)
                    {
                        AddRSShapeElement((this.DiagramTreeNode.PresentationElementClass as RelationshipShapeClass).ReferenceRelationship);
                    }
                    else
                    {
                        AddShapeElement((this.DiagramTreeNode.PresentationElementClass as PresentationDomainClassElement).DomainClass);
                    }
                }
            }
        }