C#/C# WPF 실무

[C# WPF] TreeView 새로고침 시 확장 상태 불러오기

냠냠쿠 2023. 10. 5. 16:37
728x90
        private void RefreshTree(TreeView treeView, TreeViewItem selecteditem)
        {
            //펼쳐져있던 노드 위치 저장 
            List<string> expandedItems = viewModel.SaveAllNodes(treeView, selecteditem);
            
            ...
            
            treeView.Items.Clear();
            QueryTreeViewModel.QueryTreeView(path, null, treeView);
            
			...
            
            //앞전 펼쳐져있던 노드 그대로 다시 열어줌
            viewModel.TraverseAndExpandTree(treeView.Items, expandedItems);
        }
            //노드 확장 상태 저장
            public List<string> SaveAllNodes(TreeView treeView, TreeViewItem selecteditem)
            {
                List<string> expandedItems = new List<string>();

                TraverseTreeView(treeView, treeView.Items, expandedItems);

                return expandedItems;
            }

            //저장된 노드 확장상태를 통해 다시 펼치기 
            private void TraverseTreeView(TreeView treeView, ItemCollection items, List<string> expandedItems)
            {
                foreach (var item in items)
                {
                    TreeViewItem treeItem = item as TreeViewItem;
                    if (treeItem != null && treeItem.IsExpanded) expandedItems.Add(treeItem.Header.ToString());

                    // 하위 노드가 있는 경우 재귀함수 호출 
                    if (treeItem != null && treeItem.HasItems) TraverseTreeView(treeView, treeItem.Items, expandedItems);
                }
            }

           //저장된 노드 확장상태를 통해 다시 펼치기 
            public void TraverseAndExpandTree(ItemCollection items, List<string> expandedItems)
            {
                foreach (var item in items)
                {
                    TreeViewItem treeItem = item as TreeViewItem;
                    if (treeItem != null && expandedItems.Contains(treeItem.Header.ToString())) treeItem.IsExpanded = true;

                    // 하위 노드가 있는 경우 재귀함수 호출 
                    if (treeItem != null && treeItem.HasItems) TraverseAndExpandTree(treeItem.Items, expandedItems);
                }
            }
728x90