[WPF]TreeView Control 사용

Eden·2024년 1월 24일
0
//xaml 부분
<TreeView x:Name="folderTreeView" Grid.Row="1" Padding="5,10,5,10"  Width="{Binding ElementName=folderComboBox, Path=ActualWidth}" ItemsSource="{Binding RootItem.Items}"  Background="{StaticResource Background.2}" >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Items}" >
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Text}" VerticalAlignment="Center"/>
                <CheckBox VerticalAlignment="Center" IsChecked="{Binding isChecked}" Margin="20,0,0,0"/> //check박스 컨트롤을 추가해 사용
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="true" /> //아래 아이템이 열린상태
            <Setter Property="FontSize" Value="{Binding TextSize}"/> //level별로 글자크기를 다르게 하고싶을때
            <Setter Property="Foreground" Value="{StaticResource Foreground.4}"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

//xaml.cs
		public MainWindow()
        {
            InitializeComponent();
            DataContext = MainViewModel.Instance;
   		}



//MainViewModel 부분
		//싱글톤으로 사용
		static MainViewModel _instance = null;
        public static MainViewModel Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new MainViewModel();

                return _instance;
            }
        }
        private TreeViewItems _RootItem;
        public TreeViewItems RootItem
        {
            get { return _RootItem; }
            set
            {
                _RootItem = value;
                OnPropertyChanged("RootItem");
            }
        }       
        private ObservableCollection<ComboBoxItem> _DateComboBoxItems = new ObservableCollection<ComboBoxItem>();
        public ObservableCollection<ComboBoxItem> DateComboBoxItems
        {
            get { return _DateComboBoxItems; }
            set
            {
                _DateComboBoxItems = value;
                OnPropertyChanged("DateComboBoxItems");
            }
        }
        public void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            var newItem = e.NewValue as TreeViewItems;
            SelectedTreeItem = SearchSelectedItemd(RootItem.Items.ToList(), newItem.Text);
        }
        public TreeViewItems SearchSelectedItemd(List<TreeViewItems> itemList, string item)
        {
            TreeViewItems retData = null;
            foreach (var it in itemList)
            {
                if (it.Text == item)
                    return it;
                retData = SearchSelectedItemd(it.Items.ToList(), item);

                if (retData != null)
                    return retData;
            }
            return retData;
        }
        private void AddTreeFolder(string path, TreeViewItems parent)
        {
           
                var item = new TreeViewItems(parent);
                item.Text = path.Split('\\')[path.Split('\\').Length - 1];
                if (parent != null)
                {
                    item.TextSize = 13;
                    parent.SetItems(item);
                    parent = item;
                }
                else
                {
                    parent = item;
                    item.TextSize = 15;
                    item.Parent = RootItem;
                    RootItem.SetItems(item);
                }
            

            string[] subdirectoryArray = Directory.GetDirectories(path);
            if(subdirectoryArray.Length > 0)
            {
                for(int i = 0; i < subdirectoryArray.Length; i++)
                {
               
                    AddFlightFolder(subdirectoryArray[i], parent);
                }
            }
        }
        public void SetTreeFolder()
        {
            folderpath = Environment.CurrentDirectory + @"\..\resource\test";
            string[] subdirectoryArray = Directory.GetDirectories(folderpath);
            RootItem = new TreeViewItems(null);
            RootItem.Depth = 0;
            RootItem.Text = "Root";
            for (int i = 0; i < subdirectoryArray.Length; i++)
            {
                AddTreeFolder(subdirectoryArray[i], null);
            }
        }
        
        
//TreeViewItems.cs 트리뷰아이템 클래스
	class TreeViewItems : PropertyModel
    {
        public int Depth { get; set; } // 아이템 level
        public string Text { get; set; } //화면에 도시되는 아이템 이름
        public TreeViewItems Parent { get; set; } // 부모 item
        public IList<TreeViewItems> Items { get; set; } //자식 item
        public TreeViewItems(TreeViewItems parent)
        {
            if(parent != null)
            {
                Parent = parent;
                Depth = parent.Depth + 1;
            }
            Items = new ObservableCollection<TreeViewItems>();
        }
        private int textSize = 13;
        public int TextSize
        {
            get { return textSize; }
            set
            {
                textSize = value;
                OnPropertyChanged("TextSize");
            }
        }
        private bool _isChecked = false;
        public bool isChecked
        {
            get { return _isChecked; }
            set
            {
                _isChecked = value;
                if (value)
                {
                    if (Depth == 0)
                    {
                        for (int i = 0; i < this.Items.Count; i++)
                        {
                            this.Items[i].isChecked = true; //자식 아이템 전부 체크 
                        }
                    }
                    else if (Depth == 1)
                    {

                        string filepath = Environment.CurrentDirectory + "\..\resource\test\";
                        string substring = this.Text;
                        var parent = this.Parent;
                        for (int i = 0; i < this.Depth; i++)
                        {
                            substring = parent.Text + "\" + substring;
                            parent = parent.Parent;
                        }
                        filepath += substring; //  체크박스 선택 경로
                    }
                }
                else
                {
                    if (Depth == 0)
                    {
                        for (int i = 0; i < this.Items.Count; i++)
                        {
                            this.Items[i].isChecked = false;
                        }
                    }
                }
                OnPropertyChanged("isChecked");
            }
        }
        public void SetItems(TreeViewItems item)
        {
            Items.Add(item);
        }
    }

SetTreeFolder / AddTreeFolder / isChecked(set) 함수를 필요에 맞게 커스터 마이징 해서 사용하자
적용 화면

profile
주섬주섬..

0개의 댓글