2010-06-02 93 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

相關問題