Создание обработчика событий для TreeViewItem в WPF


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

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

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

3 2

3 ответа:

Если вы хотите захватить событие 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();
}

Вам нужно будет добавить обработчик событий в событие SelectedItemChanged 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
    }

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