//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) 함수를 필요에 맞게 커스터 마이징 해서 사용하자
적용 화면