IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

TreeView + HierarchicalDataTemplate + RoutedEvent


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Par défaut 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 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)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Par défaut
    Bonjour,

    Juste pour vous dire que j'ai résolu le soucis. En faite, j'essayai de câbler un événement d'instance sur un RoutedEvent qui apparemment, dans ce contexte, ne peux se câbler que sur des événements statics.

    Donc en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Setter Property="ev:TreeViewItemBehavior.OnMouseDoubleClick" Value="{x:Static a.ListeMapModule.CommandTest}"/>
    Au lieu d'un "{Binding ...}", cela fonctionne bien mieux !!


    Merci à ce qui ont pu m'aider et qui peuvent passer sur ce forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Treeview/HierarchicalDataTemplate : IsMouseOver
    Par koyot3 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 23/01/2012, 16h19
  2. [TreeView] HierarchicalDataTemplate et Binding
    Par al2000 dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 08/12/2011, 15h24
  3. TreeView + HierarchicalDataTemplate
    Par jacquesprogram dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 24/08/2011, 15h54
  4. TreeView, HierarchicalDataTemplate et Binding depuis un DataSet
    Par dtcSearch dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 06/05/2010, 09h57
  5. TreeView / HierarchicalDataTemplate / TreeViewItem : comment faire ?
    Par seiryujay dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 23/04/2009, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo