2009-04-14 61 views
2

我使用Silverlight工具包中的TreeView組件,並試圖獲取選定節點的父項。 TreeView綁定到一系列對象,所以直接使用TreeViewItem似乎是不可能的。Silverlight工具包Treeview:獲取所選項目的父項

<toolkit:TreeView SelectedItemChanged="DoStuff" DisplayMemberPath="Name" ItemsSource="{Binding MyCollection}"> 
    <toolkit:TreeView.ItemTemplate> 
     <common:HierarchicalDataTemplate ItemsSource="{Binding MySubCollection}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}" /> 
      </StackPanel> 
     </common:HierarchicalDataTemplate> 
    </toolkit:TreeView.ItemTemplate> 
</toolkit:TreeView> 

有沒有辦法獲取在DoStuff事件中選擇的項目的父項?

回答

3

只要你下載了最新的Silverlight工具包,那麼這是很容易使用包含的TreeViewExtensions。

  1. 下載Silverlight Toolkit並安裝。
  2. 添加到System.Windows.Controls.Toolkit參考(從Silverlight工具包)
  3. 使用GetParentItem()擴展方法,像這樣:

    private void DoStuff(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
        if (e.NewValue != null) 
        { 
         var parent = ((TreeView)sender).GetParentItem(e.NewValue); 
         // 
         // Do stuff with parent, this snippet updates 
         // a TextBlock showing the name of the current parent 
         if (parent != null) 
         { 
          Status.Text = parent.ToString(); 
         } 
        } 
    } 
    
1

爲什麼不只是讓MySubcollection中的對象保持對父對象的引用?

+0

這是做合理的事情,但沒有回答這個問題。 :) – 2009-04-15 16:37:12

0

假設你的樹的名字是「樹」,這應該做的伎倆

((tree.SelectedItem as TreeViewItem).Parent as SomeObjectOfYours) 
+2

我不認爲這會奏效。假設OP使用數據綁定,tree.SelectedItem將返回綁定的對象而不是TreeViewItem。 – Andy 2009-05-20 16:48:40

0

Justin Angel寫了一篇關於「先進」的TreeView使用,其中包括通過其綁定對象發現在一個TreeView arbirtraty元素。 因爲我對Silverlight來說比較新,所以我不確定是否有更好,更優雅的方法,但是可以使用他的方法之一來查找父項。

我想用電話這種方式:

TreeViewItem trvi = ContainerFromItem(tree, tree.SelectedItem); 
MySubCollectionItem parentItem = ItemFromContainer(tree, trvi.Parent); // note the "Parent" here 

下面提供的擴展方法從什麼地方:

public static TreeViewItem ContainerFromItem(this TreeView treeView, object item) 
{ 
    TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item); 
    if (containerThatMightContainItem != null) 
     return containerThatMightContainItem; 
    else 
     return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item); 
} 

private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item) 
{ 
    foreach (object curChildItem in itemCollection) 
    { 
     TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem); 
     if (parentContainer == null) 
      return null; 
     TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item); 
     if (containerThatMightContainItem != null) 
      return containerThatMightContainItem; 
     TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item); 
     if (recursionResult != null) 
      return recursionResult; 
    } 
    return null; 
} 

public static object ItemFromContainer(this TreeView treeView, TreeViewItem container) 
{ 
    TreeViewItem itemThatMightBelongToContainer = (TreeViewItem)treeView.ItemContainerGenerator.ItemFromContainer(container); 
    if (itemThatMightBelongToContainer != null) 
     return itemThatMightBelongToContainer; 
    else 
     return ItemFromContainer(treeView.ItemContainerGenerator, treeView.Items, container); 
} 

private static object ItemFromContainer(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, TreeViewItem container) 
{ 
    foreach (object curChildItem in itemCollection) 
    { 
     TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem); 
     if (parentContainer == null) 
      return null; 
     TreeViewItem itemThatMightBelongToContainer = (TreeViewItem)parentContainer.ItemContainerGenerator.ItemFromContainer(container); 
     if (itemThatMightBelongToContainer != null) 
      return itemThatMightBelongToContainer; 
     TreeViewItem recursionResult = ItemFromContainer(parentContainer.ItemContainerGenerator, parentContainer.Items, container) as TreeViewItem; 
     if (recursionResult != null) 
      return recursionResult; 
    } 
    return null; 
}