2016-07-08 3 views
0

展開されているTreeViewItem(またはオブジェクト)にアクセスするにはどうすればよいですか?私の見積もりでは、イベントハンドラからの "送信者"はTreeViewItemでなくTreeViewでなければなりません。私は、TreeViewItemが展開されているときにバインドされたオブジェクトに作用したいと思います。なぜWPF TreeViewItem.Expanded "送信者"がTreeViewItemではなくTreeViewを渡すのですか?

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" 
    Loaded="Window_Loaded"> 
<StackPanel> 
    <TreeView x:Name="treeView" HorizontalAlignment="Left" VerticalAlignment="Top" 
       TreeViewItem.Expanded="treeViewItem_Expanded" > 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding}"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
</StackPanel> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     Element root = new Element() { Name = "root" }; 
     Element a1 = new Element() { Name = "a1" }; 
     Element a2 = new Element() { Name = "a2" }; 
     Element b1 = new Element() { Name = "b2" }; 
     root.Add(a1); 
     root.Add(a2); 
     a2.Add(b1); 
     treeView.ItemsSource = root; 
    } 

    private void treeViewItem_Expanded(object sender, RoutedEventArgs e) 
    { 
     TreeViewItem tvi = sender as TreeViewItem; 
     tvi = e.Source as TreeViewItem; 
     TreeView tv = sender as TreeView; 
    } 

    public interface IElement 
    { 
     string Name { get; set; } 
    } 

    public class Element : ObservableCollection<IElement>, IElement 
    { 
     public string Name { get; set; } 
    } 
} 
+0

'e.OriginalSource'はツリービューアイテムであり、実際に – icebat

+0

@icebatありがとう! –

答えて

0

TreeViewItem.Selectedイベントを使用してください。 TreeViewItem自体が、HierarchicalDataTemplateを使用しているときに設計時に存在しない)ツリービューにバブルする選択されたイベントです。

ようにイベントがXAMLに捕捉することができる。

<TreeView TreeViewItem.Selected="TreeViewItemSelected" .../> 

は、選択された最後のツリービューアイテムのようにイベント内で設定することができる。

private void TreeViewItemSelected(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem tvi = e.OriginalSource as TreeViewItem; 

    // set the last tree view item selected variable which may be used elsewhere as there is no other way I have found to obtain the TreeViewItem container (may be null) 
    this.lastSelectedTreeViewItem = tvi; 

    ... 
} 
+0

拡張矢印をクリックしても、Selectedイベントはトリガーされません。 –

+0

私はあなたのコードをテストしました。私のためのツリービューは表示されません。誰かが問題を再現できるように作業コードを投稿してください。 – ViVi

関連する問題