私はユーザライブラリを表すいくつかのクラスを持っています。は、ファイルシステムと同様の階層をツリービューで表示します。一般的なものは
public class UserLibraryData
{
public IList<Node<UserDataEntry>> Nodes { get; private set; }
...
}
public class Node<T>
{
public IList<Node<T>> SubNodes { get; private set; }
public IList<T> Entries { get; private set; }
public string Name { get; private set; }
...
}
public class UserDataEntry
{
string ViewName { get; private set;}
...
}
だから、フォルダ(ノード)とファイル(エントリー)を使ってファイルシステムのようなものです:彼らはこのようになります。
今、私はそのデータをTreeViewで表現したいと思います。私はそのDataContextとしてUserLibraryData
のインスタンスを持つXAMLファイルを書きました。
<TreeView ItemsSource="{Binding Nodes}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding SubNodes}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
しかし、予想通り、それが唯一のノードとサブノード、ないエントリを示しています。TreeViewコントロールのために、私はこれを書きました。私は別の
DataTemplate
を
TreeViewTemplate
に追加しようとしましたが、そのようなテンプレートは1つしか定義できません。
どのようにして各レイヤーのノードのエントリも表示できますか?
EDIT:
は、我々は次のようUserLibraryDataがあるとします。
Node1 -> contains Node2, Node3 and Entry1, Entry2
Node2 -> contains Entry3, Entry4
Node3 -> contains Node4
Node4 -> contains Entry5
Node5 -> contains nothing
これである(すべてのノードが展開されている)私の予想される出力:
Node1
Node2
Entry3
Entry4
Node3
Node4
Entry5
Entry1
Entry2
Node5
EDIT2:
この回答https://stackoverflow.com/a/39721198/5333340は、Node
クラスは一般的ではありませんでした。残念ながら、DataType="{x:Type ...}"
は、他のSOスレッドから学んだように、汎用タイプを許可していません。一般的な回避策は、この
public class NodeUserDataEntry : Node<UserDataEntry> { ... }
のような子クラスを作成し、NodeUserDataEntry
によってNode<UserDataEntry>
のすべての発生を置き換えることです。しかし、Node
の汎用性を重視したコードがすでに作成されています。したがって、タイプをNode<UserDataEntry>
からNodeUserDataEntry
に変更することは、アプリケーション全体を再作成するようなものです。 UserLibraryData
の、Node<T>
、UserDataEntry
というコードをそのまま残して、それをいくつかのコンバーター/ラッパーで保存するだけの別の方法はありませんか?
'Entires'を' Nodes'の横のリストとして表示するか、 'Node:Entry'のようなsometingを表示しますか? – bit