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

Silverlight Discussion :

capter un événement dans un TreeView par Binding dans mon ViewModel


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut capter un événement dans un TreeView par Binding dans mon ViewModel
    Bonjour,

    Je voudrais capter l'événement "SelectedItemChanged" dans le code suivant:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <sdk:TreeView ItemsSource="{Binding MyTree}"   SelectedItemChanged="{Binding SelectedNode}"  Height="242" HorizontalAlignment="Left" Margin="54,14,0,0" Name="treeView1" VerticalAlignment="Top" Width="294">
                <sdk:TreeView.ItemTemplate >
                    <sdk:HierarchicalDataTemplate ItemsSource="{Binding OcNode}" >
                        <TextBlock Text="{Binding NodeNom}"/>
     
                    </sdk:HierarchicalDataTemplate>
                </sdk:TreeView.ItemTemplate>
            </sdk:TreeView>

    Mon selectedNode est défini comme suit dans mon ViewModel:
    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
    public clsNode SelectedNode
            {
                get
                {
                    return _selectedNode;
                }
                set
                {
                    if (_selectedNode != value)
                    {
                        _selectedNode = value;
                        OnPropertyChanged("SelectedNode");
                    }
                }
            }

    Et quand je fais, plutôt qu'un Binding, un eventHandler, mon SelectedItemChanged est bien de type clsNode.

    Quand j'exécute l'application, j'ai le message suivant:
    Failed to assign to property 'System.Windows.Controls.TreeView.SelectedItemChanged'.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Selecteditemchanged est un évent, pas une dependencyproperty, donc elle n'accepte pas de binding!

    Il vaut mieux binder selectedelement sur une property de ton VM, tu détectera le changement dans le setter.style:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Public itemcclass selecteditem
    {
    get { return blabla;}
    set { 
        Blabla = value;
        // traitement quelconque
        Raisepropertychanged("blabla"); //si mvvmlight
     
        }
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Merci pour ta réponse.

    Pourrais-tu être un peu plus explicite quand tu dis:
    Il vaut mieux binder selectedelement sur une property de ton VM, tu détectera le changement dans le setter.style:
    ???

    je n'utilise pas MVVMLight peut-être est-ce la raison ?

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Ca n'est pas sur SelectedItemChanged (qui est un évènement) auquel il faut se brancher mais SelectedItem (comme précisé par Olivier).

    Si tu souhaites vraiment te brancher sur l'évènement il faut que tu utilises une ICommand et un EventToCommand (comme celui du SDK Blend)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    d'ou mon incompréhension...

    il n'y a pas de SelectedItem dans le TreeView !

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Haha! Effectivement c'est plus dur
    Donc il faut que tu récuperes le sdk Blend. Dedans y'a deux dll interessantes: System.Windows.Interactivity et Microsoft.Expression.Interactions
    Ensuite tu crées une ICommand dans ton ViewModel et enfin tu fais un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <sdk:TreeView ItemsSource="{Binding MyTree}" Height="242" HorizontalAlignment="Left" Margin="54,14,0,0" Name="treeView1" VerticalAlignment="Top" Width="294">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectedItemChanged">
                <i:InvokeCommandAction Command="{Binding MaICommande}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <sdk:TreeView.ItemTemplate >
            <sdk:HierarchicalDataTemplate ItemsSource="{Binding OcNode}" >
                <TextBlock Text="{Binding NodeNom}"/>
            </sdk:HierarchicalDataTemplate>
        </sdk:TreeView.ItemTemplate>
    </sdk:TreeView>
    Ta commande sera appellée à chaque changement de l'item

  7. #7
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Quand je dis qu'il faut binder sur une proprieté de ton ViewModel c'est que vu que ton ViewModel gère et présente les données, il est logique ce celui-ci ait un propriété qui est l'objet selectionné de ton treeview.

    Donc, tu crée une propriété qui sera bindée à au selecteditem du treeview (pour faire le lien entre le viewmodel et la vue).

    Dans le setter de la propriété, il faut (dans la plupart des cas) rafraichir le binding, comme ça si tu modifies l'objet selectionné dans le VueModel (via du code), le changement sera reflété dans le treeview (sinon le treeview en se mettra pas a jour et il restera sur l'ancienne selection).
    Pour ce faire, soit utiliser RaisePropertyChanged (si tu as MVVM Light) ou alors, à la main, il faut implémenter INotifyPropertyChanged dans ton ViewModel. (RaisePropertyChanged est une implémentation de INotifyPropertyChanged déja prête dans MVVMLight)

    Si tu as d'autres question, n'hésite pas!

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Citation Envoyé par GuruuMeditation Voir le message
    Quand je dis qu'il faut binder sur une proprieté de ton ViewModel c'est que vu que ton ViewModel gère et présente les données, il est logique ce celui-ci ait un propriété qui est l'objet selectionné de ton treeview.

    Donc, tu crée une propriété qui sera bindée à au selecteditem du treeview (pour faire le lien entre le viewmodel et la vue).
    On est d'accord sur la manière dont interragissent ViewModel et View

    Mais..., il n'y a pas de "SelectedItem" dans le TreeView (coté XAML !!!)

    Je vais donc tenter la proposition de Nathanael.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/10/2013, 10h46
  2. Réponses: 3
    Dernier message: 06/04/2011, 11h44
  3. Listview dans un treeview en binding
    Par silberfab dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 07/04/2009, 17h26
  4. Ajout de nodes dans un treeview par le client en asp.net
    Par thewaterkidny dans le forum ASP.NET
    Réponses: 3
    Dernier message: 23/04/2007, 17h24
  5. Réponses: 5
    Dernier message: 09/01/2003, 11h55

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