2011-04-15 19 views
1

我在Silverlight 4應用程序中使用TreeView來創建ChildWindow。 ItemSource綁定到ViewModel中的Items的ObservableCollection。當窗口打開時,從web服務加載項目。當ItemSource發生變化時展開TreeView中的Root

我只有一個根節點,我需要它最初擴展。 TreeView甚至具有擴展ExpandToDepth()這看起來很完美,但我不知道我可以稱它爲何。從ItemSource更新項目後,我沒有找到發生的事件。

我嘗試在TreeView中使用ItemContainerGenerator.ItemChanged和OnItemsChanged,但它們都在生成樹視圖項目之前執行,因此展開命令將不起作用。

我該如何得到這個工作?

回答

0

我通過覆蓋TreeView中的PrepareContainerForItemOverride方法解決了我的問題。我想知道爲什麼這只是爲根節點調用,但它的工作原理。

public class ExpandedRootTreeView : TreeView 
{ 
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     TreeViewItem treeViewItem = element as TreeViewItem; 

     if (treeViewItem != null) treeViewItem.IsExpanded = true; 

     base.PrepareContainerForItemOverride(element, item); 
    } 
} 

感謝大家的回覆。

1

嘗試註冊您的ObservableCollection的CollectionChange Event並在那裏執行您的操作。

+0

如果我在collectionChanged中調用它們或立即在ViewModel中設置itemSoure屬性後展開操作不起作用。我嘗試了以下代碼: 'var x = treeView.ContainerFromItem(treeView.Items [0]); x.IsExpanded = true;' 當我在collectionChanged後執行它時,根節點已經在Items中,但還沒有容器。稍後從按鈕單擊事件調用此工作正常。 我以某種方式需要等待treeView創建容器並將其添加到控件,然後再執行此操作。 – Jarvis 2011-04-15 12:28:31

+0

如果您的TreeView項目有項目模板,那麼您可以註冊項目的Loaded事件,並且在處理程序中可以將TreeView的IsExpanded設置爲true。爲了確保過濾掉所有其他項目的Loaded事件,您可以綁定您的Tag屬性控制到DataContext和處理程序還檢查發件人的標籤是ItemsSource的第一個元素。 – Sonosar 2011-04-15 12:44:10

0

從TreeView派生並創建IsRootItemExpanded屬性並在ViewModel中創建相同的名稱屬性。在設置accesser檢查值是否true然後像這樣調用你的方法ExpandToDepth(1)當itemssource需要更新時,然後設置IsRootItemExpanded屬性爲true。您必須將TreeView的IsRootItemExpanded綁定到ViewModel的IsRootItemExpanded。

相關問題