public void UpdateProfileElements() { // Order the children var vmsList = Children.OrderBy(v => v.ProfileElement.Order).ToList(); for (var index = 0; index < vmsList.Count; index++) { var profileElementViewModel = vmsList[index]; Children.Move(Children.IndexOf(profileElementViewModel), index); } // Ensure every child element has an up-to-date VM if (ProfileElement.Children != null) { foreach (var profileElement in ProfileElement.Children.OrderBy(c => c.Order)) { TreeItemViewModel existing = null; if (profileElement is Folder folder) { existing = Children.FirstOrDefault(p => p is FolderViewModel vm && vm.ProfileElement == folder); if (existing == null) { Children.Add(_folderViewModelFactory.Create((FolderViewModel)this, folder)); } } else if (profileElement is Layer layer) { existing = Children.FirstOrDefault(p => p is LayerViewModel vm && vm.ProfileElement == layer); if (existing == null) { Children.Add(_layerViewModelFactory.Create((FolderViewModel)this, layer)); } } existing?.UpdateProfileElements(); } } }