public TrackPathPropertyChangedAndUpdateReferences(ElementLookup lookup, ElementViewModel element)
            {
                this.lookup  = lookup;
                this.element = element;

                elementPropertyChangedHandler = new PropertyChangedEventHandler(element_PropertyChanged);
                this.element.PropertyChanged += elementPropertyChangedHandler;
            }
            public TrackChildElementCreationAndRemoval(ElementLookup lookup, ElementViewModel element)
            {
                this.lookup  = lookup;
                this.element = element;

                AddElements(element.ChildElements);

                childElementsChangedHandler            = new NotifyCollectionChangedEventHandler(ChildElements_CollectionChanged);
                element.ChildElementsCollectionChange += childElementsChangedHandler;
            }
            public ElementReferenceOverAbsolutePath(ElementLookup lookup, ElementViewModel element, string path)
                : base(lookup, element)
            {
                this.path = path;

                base.PathChanged += (sender, args) =>
                {
                    this.path = Element.Path;
                };
            }
            public ElementReferenceOverAncestorPath(ElementLookup lookup, ElementViewModel element, string ancestorPath, string elementName)
                : base(lookup, element)
            {
                this.ancestorPath = ancestorPath;
                this.elementName  = elementName;

                base.PathChanged += (sender, args) =>
                {
                    this.ancestorPath = Element.ParentElement.Path;
                    this.elementName  = GetElementNamePropertyValue(Element);
                };
            }
 public ElementChangeScope(ElementLookup lookup, Func <ElementViewModel, bool> predicate)
 {
     this.lookup    = lookup;
     this.predicate = predicate;
     this.lookup.CollectionChanged += lookup_CollectionChanged;
 }