我知道已经就此进行了一些讨论,但我还未能解决我的问题。
至于按需加载项目已经正常工作。我已经将TreeViewItem子类化了,每当“Expanded”事件被触发时,我的TreeViewItemSource将获取接下来的几个节点。
但这很麻烦,因为我有自定义的TreeViewItem,而且,因为我通过TreeView.Items.Add()添加项目,所以我失去了在XAML中定义节点表示的能力。
这有点不方便,因为我想在每个节点上显示一个图标,并将其放入代码中至少有一点违反规则。
那么我的问题归结为:如果没有Bea Stollnitz的“技巧”,是不是可以绑定到IsExpanded属性?
这就是我认为它会起作用的方式,但事实并非如此:
<sdk:TreeView Name="treeView1">
<Style TargetType="sdk:TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
</Style>
<sdk:TreeView.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Children}" >
<TextBlock Text="{Binding Path=Label, Mode=OneWay}" />
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
</sdk:TreeView>
因此,如果我可以绑定到IsExpanded,我可以在扩展父级时获取新的节点。
我做错了什么?这不是问题的最佳解决方案吗?有什么新想法吗?
要明确一点:理想情况是,我可以从Web服务中获取大量POCO(例如标签和图标),并通过XAML完成所有样式。我最好不要把它们装进别的东西,因为这非常慢(至少在我目前的实施中,大约有1000个项目,滚动下降非常糟糕)。
提前致谢。
答案 0 :(得分:0)
执行此操作的一种方法是编写一个侦听Expanded
事件的附加行为,然后加载数据。这样您就不会继承TreeViewItem,仍然会在XAML中编写所有布局,但您仍然可以获得所需的动态加载行为。
修改强>
这样的事情(可能不会编译,但应该给你一个想法)
public class LoadDynamicBehavior : Behavior<TreeViewItem>
{
protected override void OnAttached()
{
AssociatedObject.Expanded += LoadData;
}
protected override void OnDetaching()
{
AssociatedObject.Expanded -= LoadData;
}
private void LoadData(object sender, EventArgs e)
{
// Load the correct data here and push it into AssociatedObject
}
}