TreeView + HierarchicalDataTemplate + RoutedEvent
Bonjour,
J'ai un soucis quand à l'utilisation du TreeView dans WPF. Je recherche à utiliser un ItemsSource sur mon TreeView pour afficher un ensemble d'élément. Et j'aimerai agir sur le double click sur chacun de ces éléments (le RoutedEvent MouseDoubleClick du TreeViewItem).
Donc pour faire un Binding sur mon TreeViewItem, je dois passer par un HierarchicalDataTemplate. Seulement quand je passe par ce HierarchicalDataTemplate, les RoutedEvent ne fonctionne plus, .....
J'utilise le pattern MVVM, et donc tous mes événements sont "routés" (je ne sait pas si je m'exprime bien)
Voici une partie de mon code XAML :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
<UserControl x:Class="Adn.Ui.Windows.Visualisation.UserControls.ucListeMap"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:a="clr-namespace:Adn.Ui.Metiers.Visualisation.Module;assembly=Adn.Ui.Metiers"
xmlns:ev="clr-namespace:ADN.Tools.UI.Event;assembly=ADN.Tools.UI"
xmlns:view="clr-namespace:Adn.Ui.Metiers.Visualisation.View;assembly=Adn.Ui.Metiers"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:rc="clr-namespace:ADN.Tools.UI;assembly=ADN.Tools.UI"
rc:CommandBindingUtils.CommandUtils="{Binding}">
<UserControl.Resources>
<a:ListeMapModule x:Key="ListeMapModule" />
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource ListeMapModule}" />
</UserControl.DataContext>
[...]
<TreeView ItemsSource="{Binding ItemSource}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="ev:TreeViewItemBehavior.OnMouseDoubleClick" Value="{Binding Test}"/>
<Setter Property="IsExpanded" Value="True"></Setter>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type view:VisualisationComposantIdentificationView}">
<TreeViewItem Header="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView> |
Ma classe pour interagir sur l'événement :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
public class TreeViewItemBehavior
{
// source : http://blogs.msdn.com/vinsibal/archive/2009/04/10/launching-a-custom-dialog-to-edit-items-in-a-datagrid-with-mvvm.aspx
public static DependencyProperty OnMouseDoubleClickProperty = DependencyProperty.RegisterAttached(
"OnMouseDoubleClick",
typeof(ICommand),
typeof(TreeViewItemBehavior),
new UIPropertyMetadata(TreeViewItemBehavior.OnMouseDoubleClick));
public static void SetOnMouseDoubleClick(DependencyObject target, ICommand value)
{
target.SetValue(TreeViewItemBehavior.OnMouseDoubleClickProperty, value);
}
private static void OnMouseDoubleClick(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
var element = target as TreeViewItem;
if ((e.NewValue != null) && (e.OldValue == null))
element.MouseDoubleClick += OnMouseDoubleClick;
else if ((e.NewValue == null) && (e.OldValue != null))
element.MouseDoubleClick -= OnMouseDoubleClick;
}
private static void OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
UIElement element = (UIElement)sender;
ICommand command = (ICommand)element.GetValue(TreeViewItemBehavior.OnMouseDoubleClickProperty);
command.Execute(e);
}
} |
J'ai testé de différentes façon l'intégration de mon événement, soit :
En passant mon événement directement sur le TreeViewItem (TreeViewItem toujours placé dans un HierarchicalDataTemplate)
Code:
1 2
|
<TreeViewItem Header="{Binding Name}" ev:TreeViewItemBehavior.OnMouseDoubleClick="{Binding Test}" /> |
En passant par un EventSetter (dans le Style de mon TreeViewItem du TreeView.ItemContainerStyle)
Code:
1 2
|
<EventSetter Event="ev:TreeViewItemBehavior.OnMouseDoubleClick" Handler="{Binding Test}" /> |
Et dans tous les cas, mon événement ne fonctionne pas, ....
Alors que si je n'utilise pas de HierarchicalDataTemplate, mon événement fonctionne, mais plus le binding, .....
N'hésitez pas à me demander des compléments d'informations.
Merci beaucoup pour votre aide.