Subscribe to events launched by children of an ItemsControl

 
 
  • Gérald Barré

ItemsControl derivatives (ListBox, TreeView, Menu, …) are widely used in WPF. Sometimes you need to subscribe to events raised by all their child items, which can be tricky to set up when using data binding. Fortunately, there is a simple solution: modify the style of the container and use the EventSetter tag:

XAML
<TreeView>
  <TreeView.Style>
    <Style>
      <EventSetter Event="TreeViewItem.Selected"
                   Handler="event_handler" />
    </Style>
  </TreeView.Style>
  <TreeViewItem Header="Item niveau 1 : 1" />
  <TreeViewItem Header="Item niveau 1 : 2"/>
  <TreeViewItem Header="Item niveau 1 : 3"/>
  <TreeViewItem Header="Item niveau 1 : 4">
    <TreeViewItem Header="Item niveau 2 : 1"/>
    <TreeViewItem Header="Item niveau 2 : 2"/>
    <TreeViewItem Header="Item niveau 2 : 3"/>
  </TreeViewItem>
  <TreeViewItem Header="Item niveau 1 : 5"/>
</TreeView>

With this approach, the event sender is the TreeView, which may not be desirable depending on your needs. If you want the sender to be the TreeViewItem instead, apply the style directly to the item type. To do this, define a Style in the TreeView's resources and set its TargetType to TreeViewItem:

XAML
<TreeView>
  <TreeView.Resources>
    <Style TargetType="{x:Type TreeViewItem}">
      <EventSetter Event="Selected"
                   Handler="event_handler" />
    </Style>
  </TreeView.Resources>
  <TreeViewItem Header="Item niveau 1 : 1 "/>
  <TreeViewItem Header="Item niveau 1 : 2 "/>
  <TreeViewItem Header="Item niveau 1 : 3 "/>
  <TreeViewItem Header="Item niveau 1 : 4 ">
    <TreeViewItem Header="Item niveau 2 : 1 "/>
    <TreeViewItem Header="Item niveau 2 : 2 "/>
    <TreeViewItem Header="Item niveau 2 : 3 "/>
  </TreeViewItem>
  <TreeViewItem Header="Item niveau 1 : 5"/>
</TreeView>

Do you have a question or a suggestion about this post? Contact me!

Follow me:
Enjoy this blog?