List<OBJ> OBJS
プロパティに保存した OBJ のリストがあり、HierarchicalDataTemplate
動作するデータ用の を作成しました (以下を参照)。
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type EntityType:Projectiles}"
ItemsSource="{Binding Value}">
<TextBlock Text="{Binding RelativeSource={RelativeSource Self},
Converter={StaticResource NameConverter}}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
これにより、以下の TreeView が得られました。
- 発射物A
- 投射物B
- 投射物C
- 粒子A
- 粒子B
- 粒子C
ただし、私のデータは実際にはList
ofOBJ
であるため、同じリストに子クラスが存在するため、クラスを独自の の下にグループ化したいと考えましたType
。つまり、、などのノードがnew List<OBJ>() { new Projectiles(), new Particles() }
必要です。私はそれを に変更するを作成しましたが、現在は であるため、上記では機能しません。Projectiles
Particles
Converter
Dictionary
HierarchicalDataTemplate
Dictionary<string, List<OBJ>
HierarchicalDataTemplate
次に、を処理する新しいを作成しましたDictionary<string, List<OBJ>
。以下を参照してください。
<TreeView Name="MyTreeView" ItemsSource="{Binding OBJS,
Converter={StaticResource ItemsSourceConverter}}"
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Value}">
<TextBlock Text="{Binding Key}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
そしてConverter
:
class ItemsSourceConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
List<OBJ> objs = new List<OBJ>(value as List<OBJ>);
var query = (from a in objs
group a by a.GetType() into b
select new {
EntityName = b.Key.ToString().Split('.').Last().Substring(0,1).ToUpper() + b.Key.ToString().Split('.').Last().Substring(1).ToLower(),
Entities = b.OrderBy(a=>a.retrieveName()).ToList()
}).ToDictionary(kvp => kvp.EntityName, kvp => kvp.Entities);
return query;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
return null;
}
}
以下の TreeView が表示され、適切なグループが作成されました。
- 投射物
- 粒子
Particles
しかし、それらを展開すると、 or内の各ノードに対して次の 2 つのエラーが表示されますProjectiles
。
System.Windows.Data Error: 40 : BindingExpression path error: 'Value' property not found on 'object' 'Projectiles' (HashCode=37857370)'. BindingExpression:Path=Value; DataItem='Projectiles' (HashCode=37857370); target element is 'TreeViewItem' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')
System.Windows.Data Error: 40 : BindingExpression path error: 'Key' property not found on 'object' 'Projectiles' (HashCode=37857370)'. BindingExpression:Path=Key; DataItem='Projectiles' (HashCode=37857370); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
を設定すると、 ?で定義しTreeView.ItemTemplate
たものはすべて無視されるようです。DataTemplates
TreeView.Resources
最初の試みでは、をオブジェクトに使用することを指定するために を使用できました。指定できる構文はありDataType="{x:Type EntityType:Projectiles}"
ますか? だから私は以下のようなことをすることができますか?HierarchicalDataTemplate
Projectiles
DataType
DataType="{x:Type Dictionary<string, List<OBJ>>}"
<HierarchicalDataTemplate ItemsSource="{Binding Value}"
DataType="{x:Type Dictionary<string, List<OBJ>>}">
<TextBlock Text="{Binding Key}" />
</HierarchicalDataTemplate>
そうすれば、最終的には以下になります。
- 投射物
- 発射物A
- 投射物B
- 投射物C
- 粒子
- 粒子A
- 粒子B
- 粒子C
編集:これは、サブレベルがある場合にも機能するはずです。以下を参照してください。
- 投射物
- 投射物サブタイプA
- 発射物A
- 投射物サブタイプ B
- 投射物B
- 投射物C
- 投射物サブタイプA
- 粒子
- 粒子A
- 粒子B
- 粒子C