我不知道如何处理这个:我想要一个TreeView,它将显示来自分层数据结构的一些简单数据.作为一个基本示例(在XML中,使其易于键入):
<Node text="Root">
<Node text="Item 1">
<Node text="Item 1.1" />
</Node>
<Node text="Item 2"/>
</Node>
Run Code Online (Sandbox Code Playgroud)
问题是这理论上可以无限地嵌套,因此您无法静态定义x个级别并完成它.有没有办法定义可以解释这种结构的HierarchicalDataTemplate?
我有一个WPF,TreeView有2个级别的数据,2个HierarchicalDataTemplate格式化每个级别.从HierarchicalDataTemplate第二级开始,我需要在第一级的类中绑定一个属性.我试过这种方式,但它不起作用:
Text="{Binding Path=Ori, RelativeSource={RelativeSource TemplatedParent}}"
Run Code Online (Sandbox Code Playgroud)
与Ori作为名称的propery
即使这样它也不起作用:
Text="{Binding Path=tOri, RelativeSource={RelativeSource TemplatedParent}}"
Run Code Online (Sandbox Code Playgroud)
与tOri作为的名字TextBlock在最前一页HierarchicalDataTemplate结合的Ori属性格式.
你能帮助我吗?
短途:
我必须显示TreeView不同类型的项目的层次结构(),并且不确定如何在Silverlight中干净地执行此操作.在WPF中,可以直接HierarchicalDataTemplate根据类型定义templates(),但Silverlight中不提供此功能.在Silverlight中,您必须将相同的模板应用于特定节点的所有子节点,因此您最终会得到一个单一的怪物模板,它可以处理每个可能类型的节点,应用于每个节点.
长版(带示例):
为了给出一个更具体(但是做作)的例子,考虑各种文件夹中的档案树视图,其中每个档案可以包含照片,歌曲和其他档案.每个文件夹可能包含多个子文件夹和存档.
|-Folder
|-Folder
|-Folder
|-Archive
| Photo1
| Photo2
| Song1
| Song2
|-Archive
| Photo1
| Song1
|-Archive
| Photo1
| Photo2
| Photo3
Run Code Online (Sandbox Code Playgroud)
树中的每种类型(文件夹,存档,照片,歌曲)的显示方式都不同.显而易见的解决方案似乎是HierarchicalDataTemplate为每种类型的项目创建一个.不幸的是,我找不到一个好方法,因为你似乎必须为node(ItemsSource={Binding ...}, ItemsTemplate={StaticResource TemplateForAllChildren})的所有子节点指定一个模板类型.
此要求导致模板滚雪球...存档可以将照片,歌曲和档案作为子项.由于必须将单个模板应用于所有子项,因此该模板必须能够处理照片,歌曲和档案.同样,文件夹的模板必须能够处理文件夹和档案,而档案模板现在卡在其中的照片和歌曲,所以它最终成为一个可以处理照片,歌曲,档案和文件夹的巨型模板.随着更多类型的添加,它们也会被集中到一个巨大的模板中.
有没有办法干净地完成这项工作,而不会累积一个巨型模板(和相关的节点视图模型),因为不同的类型被添加到树中?
谢谢!
一些澄清:
感谢到目前为止的答案,但我认为他们可能会让我回到最初的问题.我可能误解了答案.
考虑TreeView显示:
对于歌曲:带有艺术家/标题的滚动文本框和播放按钮
对于图片:缩略图图像和星级评分控件
对于存档:存档图像,其中一个进度条显示压缩
对于文件夹:显示文件夹名称的普通标签
据我所知,实现这一目标的唯一方法是拥有一个包含滚动文本框,播放按钮,缩略图查看器,星形控件,图像控件,进度条和标签的巨型HierarchicalDataTemplate.然后,我只是选择性地隐藏除了实际应用于节点的一个或两个控件之外的所有控件.
在WPF中,我可以将模板与节点类型相关联,因此每个节点都可以使用适当的模板.我想知道在Silverlight中是否有办法做到这一点.
再次感谢!
我想实现一个具有以下结构的树视图.....
[RootNode] <----树的根
- [ParentNode P1] <---- ModelClass P1的对象
---- [ChildNode C1] <----- ModelClass C1的对象(有不同类型的子节点) ()
[ChildNode C2] <----- ModelClass C2的对象(也有不同类型的子
节点)---- [ChildNode C3] <----- ModelClass C3的对象(有)不同类型的孩子)
- [ParentNode Q1] <---- ModelClass Q1的对象
---- [ChildNode B1] <----- ModelClass B1的对象(也有不同类型的孩子)
- --- [ChildNode B2] <----- ModelClass B2的对象(也有不同类型的子
节点)---- [ChildNode B3] <----- ModelClass B3的对象(有不同类型的子节点)()
[ParentNode R1] <---- ModelClass R1的对象
---- [ChildNode A1] <----- ModelClass A1的对象(也有不同类型的子节点)
---- [ ChildNode A2] <----- ModelClass A2的对象(也有不同类型的子
节点)---- [ChildNode A3] <----- ModelClass A3的对象(也有不同类型的子节点))
我已经查看了本网站以及网络上提出的许多解决方案.....但只是无法弄清楚如何做到这一点......
这是我对Wpf的第一次尝试,这是一个至关重要的要求......
也很难找到上述不同类的对象模型.....
上面显示的所有类都有其他属性,包括它们的子节点......我不想只显示子节点的所有属性 …
刚开始使用wpf.我需要绑定对象(Hierarchical)文件夹
public class Folder
{
public Folder()
{
this.Name = string.Empty;
this.Modules = new ObservableCollection<Module>();
this.Folders = new List<Folder>();
this.HasChild = false;
}
public Folder(Folder parent)
{
this.Name = string.Empty;
this.Modules = new ObservableCollection<Module>();
this.Folders = new List<Folder>();
this.HasChild = false;
this.Parent = parent;
}
public bool HasChild { get; set; }
public string Name { get; set; }
public List<Folder> Folders { get; set; }
public ObservableCollection<Module> Modules { get; set; }
public Folder Parent { get; set; } …Run Code Online (Sandbox Code Playgroud) 我对WPF很新鲜,这是我在审阅了此处发布的许多先前提出的问题后,最接近实现我的目标.XAML代码:
<TreeView x:Name="folderView" Grid.Column="0" Grid.Row="1" BorderThickness="0">
<TreeViewItem Header="Folders" ItemsSource="{Binding SubFolders, Source={StaticResource RootFolderDataProvider}}" Margin="5"/>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type my:FolderView}" ItemsSource="{Binding SubFolders}">
<StackPanel Orientation="Horizontal" Name="myPanel">
<Image x:Name="img" Width="16" Height="16" Source="Images/FolderClosed.png" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding IsExpanded}" Value="True">
<Setter TargetName="img" Property="Source" Value="Images/FolderOpen.png"/>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
这将显示除了最顶层根文件夹之外的所有子文件夹上的FolderClosed图像.该HierachicalDataTemplate触发还未能展开时开火.任何帮助,将不胜感激.
基本上我需要知道的是如何将一个源发送HierarchicalDataTemplate到一个绑定,这就是我所拥有的:
<HierarchicalDataTemplate DataType="{x:Type myModel:Person}">
<StackPanel Orientation="Horizontal">
<Image Source="Images\User.gif" />
<TextBlock Margin="5,0,0,0" Text="{Binding Name}" />
</StackPanel>
<HierarchicalDataTemplate.ItemsSource>
<MultiBinding Converter="{StaticResource PersonConverter}">
<Binding Path="Name" />
<!-- Here I need something like Binding Path="Self" so I can send the source of the binding (the "Person" object) -->
</MultiBinding>
</HierarchicalDataTemplate.ItemsSource>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)
所以我的源代码是一个类型的对象myModel:Person,我希望能够发送对象本身,MultiBinding以便PersonConverter可以使用它.
谢谢你的帮助.
我参考这篇文章:
WPF TreeView HierarchicalDataTemplate - 绑定到具有多个子集合的对象
并修改树结构,如:
Root
|__Group
|_Entry
|_Source
Run Code Online (Sandbox Code Playgroud)
在Entry.cs中:
public class Entry
{
public int Key { get; set; }
public string Name { get; set; }
public ObservableCollection<Source> Sources { get; set; }
public Entry()
{
Sources = new ObservableCollection<Source>();
}
public ObservableCollection<object> Items
{
get
{
ObservableCollection<object> childNodes = new ObservableCollection<object>();
foreach (var source in this.Sources)
childNodes.Add(source);
return childNodes;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Source.cs中:
public class Source
{
public int Key { get; set; }
public …Run Code Online (Sandbox Code Playgroud) 我需要在树视图中显示Hierarchy .但是细节应该显示在数据网格中.

我如何编写模板来实现这一目标?我现在误解模板中的smth.
<TreeView ItemsSource="{Binding Path=Categories}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type stackProjects:Category}" ItemsSource="{Binding Path=SubCategories}">
<TextBlock Margin="3" Text="{Binding Path=CategoryName}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type stackProjects:SubCategory}" ItemsSource="{Binding Path=Details}">
<TextBlock Text="{Binding Path=SubCategoryName}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type stackProjects:Detail}" >
<StackPanel Orientation="Horizontal">
<TextBlock Margin="3" Text="{Binding Path=Name}"/>
<TextBlock Margin="3" Text=" - "/>
<TextBlock Margin="3" Text="{Binding Path=Info}"/>
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud) 我有TreeView一个HierarchicalDataTemplate.项目已正确填写但我无法点击这些TreeView项目.(我不能选择一个,所以标记为蓝色).我可以在前面点击TreeViewItem然后选中的标记为蓝色.看起来我可以点击一个小盒子而不是其他的盒子.
这是我的代码:
XAML:
<TreeView ItemsSource="{Binding Main.TreeItems}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
<TreeViewItem Header="{Binding Path=Header}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
模型
public class ITreeItem
{
public string Header { get; set; }
public List<ITreeItem> Children { get; set; }
}
class MainModel : INotifyPropertyChanged
{
private List<ITreeItem> _treeitems;
public MainModel()
{
_treeitems = new List<ITreeItem>();
List<ITreeItem> treeList = new List<ITreeItem>();
ITreeItem myItem1 = new ITreeItem();
myItem1.Header = "Test1";
myItem1.Children = new List<ITreeItem>();
treeList.Add(myItem1);
myItem1.Header = "Test2"; …Run Code Online (Sandbox Code Playgroud) wpf ×9
treeview ×7
xaml ×4
binding ×2
c# ×2
data-binding ×1
datagrid ×1
datatemplate ×1
itemssource ×1
lazy-loading ×1
multibinding ×1
parent ×1
properties ×1
silverlight ×1