0

私がこのようなものを持っているとしましょう:

public class TopicFolder
    {
        #region Constants and Fields

        private readonly List<TopicInfo> folderContent;

        private readonly List<TopicFolder> subFolders;

        #endregion

...
    }

そのようなタイプのデータテンプレートを実装するにはどうすればよいですか?現在私は持っています:

<HierarchicalDataTemplate DataType="{x:Type local:TopicFolder}" ItemsSource="{Binding SubFolders}" >
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:TopicInfo}" ItemsSource="{Binding FolderContent}">
            <TextBlock Text="{Binding TopicName}"/>
        </HierarchicalDataTemplate>

ただし、これにはフォルダの内容は表示されません。2番目のテンプレートDataTypeはlocal:TopicFolderである必要があるようですが、これはWPFでは許可されていません。

助言がありますか?

UPD:TreeViewは次のようにObservableCollection <TopicFolder>にバインドされます:

ItemsSource="{Binding Path=Folders}"

PS:それは間違いなくプライベート/パブリック/プロパティの問題ではありません。投稿されたフィールドに対応するパブリックプロパティがあります。出力にバインディングエラーはありません。FolderContentアイテムが表示されていないだけです。

4

1 に答える 1

1

編集:

サブフォルダーとコンテンツの両方を表示するには、を使用するMultiBindingか、フォルダーとコンテンツが特定の順序で表示されることを気にしない場合は、複合パターンを使用することをお勧めします。そのため、サブフォルダーとFolderContentを削除して置き換えます。複合インターフェースを実装するオブジェクトのコレクションを使用します(wikiの記事を読んでください)。

2つのコレクションをマージして、それにバインドできるようにするプロパティを作成することは、悪い習慣です。

複合パターンの例:

public interface ITopicComposite
{
    // <Methods and properties folder and content have in common (e.g. a title)>

    // They should be meaningful so you can just pick a child
    // out of a folder and for example use a method without the
    // need to check if it's another folder or some content.
}

public class TopicFolder : ITopicComposite
{
    private readonly ObservableCollection<ITopicComposite> children = new ObservableCollection<ITopicComposite>();
    public ObservableCollection<ITopicComposite> Children
    {
        get { return children; }
    }

    //...
}

public class TopicInfo : ITopicComposite
{
    //...
}
于 2011-01-31T17:14:21.357 に答える