OnExpanded event for any item in a treeview

c#, data-binding, treeview, wpf

Solution

You can use the `TreeViewItem.Expanded` event as an attached event :

<TreeView TreeViewItem.Expanded="TreeViewItem_Expanded"
          ItemsSource="{Binding}">
    ...
</TreeView/>

In code-behind, you can identify the `TreeViewItem` that initiated the event using the `OriginalSource` property :

    private void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
    {
        TreeViewItem tvi = e.OriginalSource as TreeViewItem;
        if (tvi != null)
        {
            MessageBox.Show(string.Format("TreeNode '{0}' was expanded", tvi.Header));
        }
    }

Problem

I'd like to get an event for any expansion of a treeviewitem in my treeview. The reason for this, a bit unrelated to the original question: I am creating a tree that relates closely to an xml file tree, but I am allowing an include element in the xml so the tree can go across multiple files. I'd like to set the itemssource property of treeviewitems within my treeview upon expansion.

Original source