我有一个 OBJ 列表,我已经存储到List<OBJ> OBJS
属性中,并且我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
,OBJ
所以在同一个列表中有子类,我想将这些类分组到它自己的下面Type
。即new List<OBJ>() { new Projectiles(), new Particles() }
应该有一个用于,等的节点。我创建了一个将其更改为a 的节点,然后它不适用于上述内容,因为它现在是 a 。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 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