0

チェックボックスを表示する複数のレベルを持つツリービューを作成するためのコードを次に示します。次のコードでは、フォルダーの下にあるファイルを表示できません。これを引き起こす 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など、
4

2 に答える 2

-1

動作しました。以下は私が行った変更です。

        public IList Children
    {
        get
        {
            return new CompositeCollection()
        {
            new CollectionContainer() { Collection = Folders },
            new CollectionContainer() { Collection = Files }
        };
        }
    }

                <HierarchicalDataTemplate DataType="{x:Type local:Folder}" ItemsSource="{Binding Children}">

これが私に解決策を与えたリンクです:

型が混在する WPF ツリービュー データバインド階層データ

于 2013-05-21T17:34:16.293 に答える