2010-04-10 5 views
2

Я добавляю элементы в элемент управления TreeView через свойство ItemsSource и свойство ItemTemplate, чтобы установить шаблон для TreeViewItem. Как я могу добавить обработчик событий для обработки события изменения выбора в TreeViewItems?
Сейчас мой ItemTemplate выглядит следующим образом:Создать обработчик событий для TreeViewItem в WPF

<Window.Resources><DataTemplate x:Key="PeerDetailTemplate"> 
     <TextBlock Text="{Binding DESCRIPTION}" Tag="{Binding ID}" GotFocus="GetModules"/> 
</DataTemplate></Window.Resources> 

Но это не работает (GetModules не называется). Я новичок в WPF, поэтому покажу мне правильное направление, чтобы делать такие вещи, пожалуйста.

ответ

4

Если вы хотите, чтобы захватить SelectedItemChanged событие в TreeView , то вам необходимо установить обработчик события на родительском узле, т.е.

XAML

<StackPanel> 
    <TreeView SelectedItemChanged="OnTreeViewSelectedItemChanged">   
     <TreeViewItem Header="Desktop"> 
      <TreeViewItem Header="Computer" /> 
      <TreeViewItem Header="My Documents" /> 
      <TreeViewItem Header="c:\" /> 
     </TreeViewItem> 
     <TreeViewItem Header="Recyle Bin" > 
      <TreeViewItem Header="foo.txt" /> 
      <TreeViewItem Header="bar.txt" /> 
      <TreeViewItem Header="fizz.buzz" /> 
     </TreeViewItem> 
     <TreeViewItem Header="Control Panel" > 
      <TreeViewItem Header="Programs" /> 
      <TreeViewItem Header="Security" /> 
      <TreeViewItem Header="User Accounts" /> 
     </TreeViewItem> 
    </TreeView> 

    <TextBlock Margin="20" x:Name="MyTextBlock" /> 
</StackPanel> 

Код За:

private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    MyTextBlock.Text = ((TreeViewItem) ((TreeView) sender).SelectedItem).Header.ToString(); 
} 
2

Вам нужно добавить обработчик события в событие SelectedViewItemChanged TreeView.

<TreeView x:Name="myTreeView" 
      SelectedItemChanged="myTreeView_SelectedItemChanged" 
      ItemTemplate="{StaticResource PeerDetailTemplate} /> 

Поскольку это срабатывает после того, как выбор изменяется, вы можете использовать выбранное свойство элемента в TreeView, чтобы получить доступ к элементу в виде дерева:

private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     TreeViewItem selectedItem = (TreeViewItem)myTreeView.SelectedItem; 
     // do stuff 
    } 
1

Выбор и выбор и фокус два разных понятия. Похоже, вас интересует выбор, который в этом случае является свойством TreeView. Событие TreeView.SelectedItemChanged уведомит вас об изменениях и свойствах недвижимости TreeView.SelectedItem сообщит вам, что выбрано.

+0

Да, в предыдущих ответах говорили, что это помогло. Спасибо всем за ответы, но как ответ плохо отметим первый. Остальное будет +1 – 0x49D1

+0

И означает ли это, что даже TreeViewItem, находящийся глубоко внутри структуры TreeView, будет показан в SelectedItem? – 0x49D1

+1

yes, событие SelectedItemChanged всегда будет захватывать текущий SelectedItem (TreeViewItem) независимо от того, насколько глубоко вложен TreeViewItem в TreeView. –

Смежные вопросы