private void ReplaceChildren(ObservableCollection <AppViewModel> freshApps)
        {
            UiDispatcherService.RunOnUiThread(() => Children.Clear());
            foreach (TreeViewItemViewModel avm in freshApps)
            {
                UiDispatcherService.RunOnUiThread(() => Children.Add(avm));
            }

            if (Children.Count == 0)
            {
                UiDispatcherService.RunOnUiThread(() => Children.Add(EmptyPlaceholder));
            }
            else if (Children.Count > 1 && HasEmptyPlaceholder)
            {
                UiDispatcherService.RunOnUiThread(() => Children.Remove(EmptyPlaceholder));
            }
        }
        /// <summary>
        /// add any ovms to cfivm.Children which are in currentOrgs but not in cfivm.Children.
        /// </summary>
        /// <param name="cfivm"></param>
        /// <param name="freshOrgs"></param>
        private void AddNewOrgs(ObservableCollection <OrgViewModel> freshOrgs)
        {
            foreach (OrgViewModel newOVM in freshOrgs)
            {
                if (newOVM != null)
                {
                    bool orgInChildren = Children.Any(ovm =>
                    {
                        var oldOVM = ovm as OrgViewModel;
                        return(oldOVM != null && oldOVM.Org.OrgId == newOVM.Org.OrgId);
                    });

                    if (!orgInChildren)
                    {
                        UiDispatcherService.RunOnUiThread(() => Children.Add(newOVM));
                    }
                }
            }
        }
        /// <summary>
        /// Add any svms to Children which are in freshSpaces but not in Children.
        /// </summary>
        /// <param name="ovm"></param>
        /// <param name="freshSpaces"></param>
        private void AddNewSpaces(ObservableCollection <SpaceViewModel> freshSpaces)
        {
            foreach (SpaceViewModel newSVM in freshSpaces)
            {
                if (newSVM != null)
                {
                    bool spaceInChildren = Children.Any(svm =>
                    {
                        var oldSVM = svm as SpaceViewModel;
                        return(oldSVM != null && oldSVM.Space.SpaceId == newSVM.Space.SpaceId);
                    });

                    if (!spaceInChildren)
                    {
                        UiDispatcherService.RunOnUiThread(() => Children.Add(newSVM));
                    }
                }
            }
        }
        /// <summary>
        /// remove all ovms from cfivm.Children which don't appear in currentOrgs.
        /// </summary>
        /// <param name="cfivm"></param>
        /// <param name="freshOrgs"></param>
        private void RemoveNonexistentOrgs(ObservableCollection <OrgViewModel> freshOrgs)
        {
            var orgsToRemove = new ObservableCollection <OrgViewModel>();

            foreach (TreeViewItemViewModel priorChild in Children)
            {
                if (priorChild is OrgViewModel oldOVM)
                {
                    bool orgStillExists = freshOrgs.Any(ovm => ovm != null && ovm.Org.OrgId == oldOVM.Org.OrgId);

                    if (!orgStillExists)
                    {
                        orgsToRemove.Add(oldOVM);
                    }
                }
            }

            foreach (OrgViewModel ovm in orgsToRemove)
            {
                UiDispatcherService.RunOnUiThread(() => Children.Remove(ovm));
            }
        }
        /// <summary>
        /// Remove all svms from Children which don't appear in freshSpaces.
        /// </summary>
        /// <param name="ovm"></param>
        /// <param name="freshSpaces"></param>
        private void RemoveNonexistentSpaces(ObservableCollection <SpaceViewModel> freshSpaces)
        {
            var spacesToRemove = new ObservableCollection <SpaceViewModel>();

            foreach (TreeViewItemViewModel priorChild in Children)
            {
                if (priorChild is SpaceViewModel oldSVM)
                {
                    bool spaceStillExists = freshSpaces.Any(svm => svm != null && svm.Space.SpaceId == oldSVM.Space.SpaceId);

                    if (!spaceStillExists)
                    {
                        spacesToRemove.Add(oldSVM);
                    }
                }
            }

            foreach (SpaceViewModel svm in spacesToRemove)
            {
                UiDispatcherService.RunOnUiThread(() => Children.Remove(svm));
            }
        }
        public override async Task RefreshChildren()
        {
            if (!IsRefreshing)
            {
                IsRefreshing = true;

                var freshOrgs = await FetchChildren();

                RemoveNonexistentOrgs(freshOrgs);
                AddNewOrgs(freshOrgs);

                if (Children.Count == 0)
                {
                    UiDispatcherService.RunOnUiThread(() => Children.Add(EmptyPlaceholder));
                }
                else if (Children.Count > 1 && HasEmptyPlaceholder)
                {
                    UiDispatcherService.RunOnUiThread(() => Children.Remove(EmptyPlaceholder));
                }

                IsRefreshing = false;
            }
        }