Generic routed event handler to command behavior

Scenario

Imagine that you need to handle from the ViewModel the SelectedIndexChanged of a WPF TreeView, currently the only way (without using any particular framework) is to build your own behavior to achieve that, or bind, via a style the IsSelected property of the node to a property of the view model, but in this second case the side effect is that to find the selected item you need to visit the whole tree.

Radical “Handle”

1
<TreeView Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
2
ItemsSource="{Binding Path=MyListOfElements}">
3
<i:Interaction.Behaviors>
4
<behaviors:Handle RoutedEvent="TreeView.SelectedItemChanged"
5
WithCommand="{Binding Path=MyAmazingCommand}"
6
PassingIn="$args.NewValue" />
7
</i:Interaction.Behaviors>
8
<TreeView.ItemTemplate>
9
<!-- omitted -->
10
</TreeView.ItemTemplate>
11
</TreeView>
Copied!
As you can imagine the value of the NewValue property of the event arguments is passed as the command parameter to the command, we currently support as placeholder:
    $args: the routed event arguments;
    $this: the WPF element the behavior is attached to;
    $source: the source of the routed event;
    $originalSource: the original source of the routed event;

Notes:

    the event identified by the RoutedEvent property must be a valid WPF RoutedEvent.
    the bound command identified by the WithCommand property must be a valid ICommand, AutoCommandBinding is not supported.
The behavior is defined in the http://schemas.radicalframework.com/windows/behaviors xml namespace.
Last modified 16d ago