チェックボックスを表示する複数のレベルを持つツリービューを作成するためのコードを次に示します。次のコードでは、フォルダーの下にあるファイルを表示できません。これを引き起こす Xaml の何が問題になっていますか? それともできないのでしょうか?
Window1.xaml
<Window x:Class="TreeViewSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TreeViewSample"
Title="Window1" Height="500" Width="800">
<DockPanel>
<TreeView DockPanel.Dock="Left" Width="300" ItemsSource="{Binding Folders}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Folder}" ItemsSource="{Binding Folders}">
<StackPanel Orientation="Horizontal">
<CheckBox Margin="2" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:File}" ItemsSource="{Binding Files}">
<StackPanel Orientation="Horizontal">
<CheckBox Margin="2" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
<Grid></Grid>
</DockPanel>
Window1.xaml.cs 分離コード コンストラクター
this.DataContext = new Window1ViewModel();
Window1ViewModel
public class Window1ViewModel : INotifyPropertyChanged
{
public Window1ViewModel()
{
_folders = new ObservableCollection<Folder>(Sample.GetFoldersAndFiles());
}
private ObservableCollection<Folder> _folders;
public ObservableCollection<Folder> Folders
{
get { return _folders; }
set { _folders = value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
サンプル データとクラス
public class Sample
{
public static List<Folder> GetFoldersAndFiles()
{
var folders = new List<Folder>();
Folder folder1 = new Folder { Name ="Folder 1" };
Folder folder2 = new Folder { Name = "Folder 2" };
Folder folder3 = new Folder { Name = "Folder 3" };
Folder folder11 = new Folder { Name = "Folder 11" };
Folder folder12 = new Folder { Name = "Folder 12" };
Folder folder22 = new Folder { Name = "Folder 22" };
folder1.Folders.Add(folder11);
folder1.Folders.Add(folder12);
folder2.Folders.Add(folder22);
File file1 = new File { Name="File 1" };
File file2 = new File { Name = "File 2" };
File file3 = new File { Name = "File 3" };
File file4 = new File { Name = "File 4" };
File file11 = new File { Name = "File 11" };
File file31 = new File { Name = "File 31" };
file1.Files.Add(file11);
file3.Files.Add(file31);
folder1.Files.Add(file1);
folder1.Files.Add(file2);
folder2.Files.Add(file3);
folder3.Files.Add(file4);
folders.Add(folder1);
folders.Add(folder2);
folders.Add(folder3);
return folders;
}
}
public class Folder
{
public Folder()
{
Folders = new List<Folder>();
Files = new List<File>();
}
public string Name { get; set; }
public ICollection<Folder> Folders { get; set; }
public ICollection<File> Files { get; set; }
}
public class File
{
public File()
{
Files = new List<File>();
}
public string Name { get; set; }
public Folder Folder { get; set; }
public ICollection<File> Files { get; set; } // This groups files together under a single file.
}
私は以下のようなツリーを持つことを期待しています:
フォルダ1
- フォルダー11
- フォルダー12
- ファイル1
- ファイル2
フォルダ2
- フォルダー22
- File3など、