/// <summary> /// This method is raised when Children.Comparer is chamged /// </summary> /// <param name="sender">The collection in which the comparer was changed</param> protected void OnChildListComparerChanged(ObservableSortedCollection <ObservableSortedTree <T> > sender, IComparer <ObservableSortedTree <T> > oldComparer) { //this.Comparer = sender.Comparer; OnPropertyChanged(nameof(Comparer)); OnComparerChanged(oldComparer); }
protected ObservableSortedTree(T value, IComparer <ObservableSortedTree <T> > comparer, ObservableSortedCollection <ObservableSortedTree <T> > children) { Value = value; Children = children; Comparer = comparer; Root = this; }
/// <summary> /// attaches and detaches events for the child list when it is changed. Triggered by setting this.Children /// </summary> /// <param name="oldChildren">the old child tree list</param> /// <param name="newChildren">the new child tree list</param> private void manageChildListEvents(ObservableSortedCollection <ObservableSortedTree <T> > oldChildren, ObservableSortedCollection <ObservableSortedTree <T> > newChildren) { if (oldChildren != null) { oldChildren.ItemAdded -= OnChildTreeAdded; oldChildren.ItemRemoved -= OnChildTreeRemoved; oldChildren.ItemChanged -= OnChildTreeChanged; oldChildren.ComparerChanged -= OnChildListComparerChanged; foreach (var child in oldChildren) { OnDetachChild(child); } } //_children = newChildren; if (newChildren != null) { newChildren.ItemAdded += OnChildTreeAdded; newChildren.ItemRemoved += OnChildTreeRemoved; newChildren.ItemChanged += OnChildTreeChanged; newChildren.ComparerChanged += OnChildListComparerChanged; foreach (var child in newChildren) { OnAttachChild(child); } } }
} = true; //use this bool to allow constructor set child list and child factory (whhich call setChildren) protected override void setChildren(ObservableSortedCollection <ObservableSortedTree <T> > newChildren) { if (initialising) { base.setChildren(newChildren); } else { throw new NotImplementedException("Cannot manually set the children list in a lazy tree"); } }
/// <summary> /// Overrideable method for setting the collection of current child tree elements /// Note: Parent, and hence Root, automatically updated for all new children /// /// </summary> /// <param name="newChildren">the list of child tree elements</param> protected virtual void setChildren(ObservableSortedCollection <ObservableSortedTree <T> > newChildren) { if (ReferenceEquals(newChildren, _children)) { return; } var old = _children; _children = newChildren; // _children.Comparer = this.Comparer; manageChildListEvents(old, _children); OnChildListChanged(old); OnPropertyChanged(nameof(Children)); //OnPropertyChanged(nameof(HasChildren)); }
protected virtual void OnChildListChanged(ObservableSortedCollection <ObservableSortedTree <T> > oldChildren) { /*if (this._children != null) * this._children.Comparer = this.Comparer;*/ ChildListChanged?.Invoke(this, oldChildren); bool oldHasChild = oldChildren != null && oldChildren.Count > 0; bool newHasChild = this._children != null && this._children.Count > 0; if (oldChildren != null && this.Children != null) { this.Children.Comparer = oldChildren.Comparer; } if (oldHasChild != newHasChild) { OnPropertyChanged(nameof(HasChildren)); } }
public void GenerateChildren() { //regenerating children bool is to allow child factory to be called when it has been changed //if AreChildrenGenerated is true when the child factory is changed, this function would return immediately, and the old children would remain //this allows the old chilren to be destroyed and new children created when needed if (AreChildrenGenerated && !regeneratingChildren) { return; } regeneratingChildren = false; AreChildrenGenerated = true; var childCollection = new ObservableSortedCollection <ObservableSortedTree <T> >(_inheritComparer); _inheritComparer = null; base.setChildren(childCollection); //AreChildrenGenerated must be set to true before base.GetChildren, otherwise it will think the children have not yet been generated and start generating them again base.getChildren().AddRange(InternalChildFactory(this)); onChildrenGenerated(); }