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 xaml : Sélectionner tout - Visualiser dans une fenêtre à part
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 c# : Sélectionner tout - Visualiser dans une fenêtre à part
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)
En passant par un EventSetter (dans le Style de mon TreeViewItem du TreeView.ItemContainerStyle)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <TreeViewItem Header="{Binding Name}" ev:TreeViewItemBehavior.OnMouseDoubleClick="{Binding Test}" />
Et dans tous les cas, mon événement ne fonctionne pas, ....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <EventSetter Event="ev:TreeViewItemBehavior.OnMouseDoubleClick" Handler="{Binding Test}" />
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.
Partager