通过IsExpanded属性在TreeView中扩展父节点时加载子节点

时间:2010-06-02 10:06:46

标签: silverlight xaml

我知道已经就此进行了一些讨论,但我还未能解决我的问题。

至于按需加载项目已经正常工作。我已经将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个项目,滚动下降非常糟糕)。

提前致谢。

1 个答案:

答案 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
    }
}