2009-04-14 18 views
2

SilverlightツールキットのTreeViewコンポーネントを使用していますが、選択したノードの親を取得しようとしています。 TreeViewは一連のオブジェクトにバインドされているため、TreeViewItemを直接操作することは問題にはならないようです。Silverlight Toolkit 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

:どこから入手できる以下の拡張メソッドで

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

含まれているTreeViewExtensionsを使用します。

  1. Silverlight Toolkitをダウンロードしてインストールします。
  2. そうのように、GetParentItem()拡張メソッドを使用します
  3. を(Silverlightのツールキットから)System.Windows.Controls.Toolkitへの参照を追加します:行うに賢明なことだ

    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

しかし、その質問には答えません。 :) –

0

これは

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

これはうまくいくとは思わない。 OPがデータバインディングを使用していると仮定すると、tree.SelectedItemはTreeViewItemではなくバインドされたオブジェクトを返します。 – Andy

0

Justin Angelトリックを行う必要があり、あなたのツリーの名前が「木」であると仮定し、ツリービューが自分のバインドされたオブジェクトでツリービューでarbirtraty要素を見つけ、それらの間、使用する「高度」について書きました。 私はSilverlightが比較的新しいので、より良い、よりエレガントな方法があるかどうかはわかりませんが、彼の方法の1つを使用して親を見つけることができます。

私はこの方法呼び出しを使用して想像:これは簡単である限り、あなたは、最新のSilverlight Toolkitをダウンロードしたとして

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; 
} 
関連する問題