2010-06-02 98 views
0

我知道已经有一些关于此问题的讨论,但是我还没有能够解决我的问题。通过IsExpanded属性在TreeView中加载父节点的子节点

至于加载需求的项目已经正常工作。我已经子类化TreeViewItem,并且每当'Expanded'事件被触发时,我的TreeViewItemSource将获取下一个节点。

但是,这是一个很混乱,因为我有自定义TreeViewItem,并且,因为我通过TreeView.Items.Add()添加项目,我失去了定义我的节点在XAML中的表示的能力。

这有点不方便,因为我想在每个节点上显示一个图标,并将其放入代码中至少会违反规则。

那么我的问题归结为:是不是可以绑定到IsExpanded属性没有来自Bea Stollnitz的“诡计”?

这是我应该如何它会工作,但不会:

<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

这样做的一种方法是编写一个附加的行为,用于监听事件并加载数据。通过这种方式,您不是继承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 
    } 
} 
+0

我如何能赶上扩展事件? 你会如此慷慨,并提供一个片段或更多的解释? – Michael 2010-06-02 13:03:40

+0

添加要显示的代码。 – Stephan 2010-06-02 14:20:38

相关问题