3

HierarchicalDataTemplate.DataType を 2 つの concreate クラスに定義することで、2 レベルの TreeView を実装する方法を知っていました。HierarchicalDataTemplate.DataType をインターフェースに定義することに関するトピックもいくつか見つけまし た。 wpf HierarchicalDataTemplate でインターフェイスを使用する方法

ただし、TreeView にはフォルダーとファイルの 2 つのレベルがあり、IFolder と IFile の 2 つのインターフェイスによって縮小されます。ネストされた TreeViewItems を作成すると、TargetInvocationException がスローされます。ただし、TreeViewItem を 1 レベルだけ作成すれば問題ありません。

これはコードです: (VS2010 ソリューション全体をここからダウンロードできます (ダウンロード後に拡張子の名前を png から zip に変更します): http://img.bbs.csdn.net/upload/201307/23/1374565982_74852.png )

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:ItemTemplateSelector x:Key="ItemTemplateSelector">
        <local:ItemTemplateSelector.FolderTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:IFolder}" ItemsSource="{Binding Items}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </local:ItemTemplateSelector.FolderTemplate>
        <local:ItemTemplateSelector.FileTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:IFile}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </local:ItemTemplateSelector.FileTemplate>
    </local:ItemTemplateSelector>
</Window.Resources>
<Grid>
    <TreeView Name="tvwFiles" ItemTemplateSelector="{DynamicResource ItemTemplateSelector}" />
</Grid>

class ItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate FolderTemplate { get; set; }
    public DataTemplate FileTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        IFolder folder = item as IFolder;
        if (folder != null)
        {
            return FolderTemplate;
        }

        IFile file = item as IFile;
        if (file != null)
        {
            return FileTemplate;
        }

        return null;
    }
}


public interface IFolder
{
    string Name { get; set; }
}


public interface IFile
{
    string Name { get; set; }
}


public class Folder : IFolder
{
    public string Name { get; set; }

    public ICollection<object> Items
    {
        get
        {
            ICollection<object> items = new List<object>();

            if (SubFolders != null)
            {
                foreach (var folder in SubFolders)
                    items.Add(folder);
            }

            if (Files != null)
            {
                foreach (var file in Files)
                    items.Add(file);
            }

            return items;
        }
    }

    public ICollection<IFolder> SubFolders { get; set; }
    public ICollection<IFile> Files { get; set; }

    public Folder(string name)
    {
        Name = name;
    }
}


public class File : IFile
{
    public string Name { get; set; }

    public File(string name)
    {
        Name = name;
    }
}


public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        ObservableCollection<object> dirs = new ObservableCollection<object>();
        Folder folder = new Folder("Root");
        dirs.Add(folder);
        for (int i = 0; i < 3; ++i)
        {
            Folder subfolder = new Folder("Folder" + i);
            for (int j = 0; j < 3; ++j)
            {
                File File = new File("File" + j);
                subfolder.Files.Add(File);
            }
            folder.SubFolders.Add(subfolder);
        }

        tvwFiles.ItemsSource = dirs;
    }
}
4

2 に答える 2

0

あなたはこれを間違った方法で見ているのではないかと思います。を使用しHierarchicalDataTemplateて、親レイヤーのデータのタイプを宣言します。最も重要なのは、子アイテムを含むプロパティです。データ構造の設定と考えてください。

次に、通常の追加DataTemplateの s を使用して、使用されるさまざまなデータ型のスタイルを設定できます。キーを指定せずにセクションでDataTemplatesを宣言すると、そのタイプのすべてのオブジェクトに自動的に影響します。Resources

私はファイル同期アプリケーションを作成し、Windows Explorer のように見えるようにスタイルを設定しました。同様のことをしようとしていると思います。ただし、ファイル オブジェクトとフォルダー オブジェクトにインターフェイスを使用する必要はありませんでした。それぞれに、さまざまな種類のファイル アイコンを表示するために作成した を使用しTypeてプロパティにバインドできるプロパティがありました。Image.SourceFileTypeConverter

DataTemplate1 つはファイルをレンダリングするように設計し、もう 1 つはフォルダーをレンダリングするように設計し、もう 1 つはプロパティHierarchicalDataTemplateを使用して各アイテムの構造とコンテナーを定義するように設計しました。HierarchicalDataTemplate.ItemContainerStyle残念ながら、現時点ではそのプロジェクトにアクセスできないため、これ以上のコード例を提供することはできません.

または、関連する記事を次に示します。

WPFで2レベルのTreeView HierarchicalDataTemplateを設定します

WPF TreeView HierarchicalDataTemplate - 複数の子コレクションを持つオブジェクトへのバインディング

于 2013-07-23T11:21:49.040 に答える