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 :

Listbox et templateselector, ca fonctionne mais pas de refresh


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut Listbox et templateselector, ca fonctionne mais pas de refresh
    Bonjour à tous,

    Je viens d'implémenter un fonctionnement sur un listbox permettant d'utiliser plusieurs templates différents qui seront choisis selon un critere de l'objet bindé en tant qu'item.

    Voici le code :

    Code : 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
    34
    35
    36
    37
    38
    39
     
    Public Class MultiTemplateListBox
        Inherits ListBox
     
        Public Shared ReadOnly TemplateSelectorProperty As DependencyProperty = _
            DependencyProperty.Register("TemplateSelector", GetType(LstDataTemplateSelector), GetType(MultiTemplateListBox), New PropertyMetadata(New PropertyChangedCallback(AddressOf OnTemplateChanged)))
     
        Public Property TemplateSelector() As LstDataTemplateSelector
            Get
                Return Me.GetValue(TemplateSelectorProperty)
            End Get
            Set(ByVal value As LstDataTemplateSelector)
                Me.SetValue(TemplateSelectorProperty, value)
            End Set
        End Property
     
        Protected Overrides Sub PrepareContainerForItemOverride(ByVal element As System.Windows.DependencyObject, ByVal item As Object)
            MyBase.PrepareContainerForItemOverride(element, item)
     
            Dim listBoxItem As ListBoxItem = element
            If listBoxItem IsNot Nothing Then
                listBoxItem.ContentTemplate = Me.TemplateSelector.SelectTemplate(item, Me)
            End If
     
        End Sub
     
        Private Shared Sub OnTemplateChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
     
        End Sub
     
    End Class
     
    Public Class LstDataTemplateSelector
     
        Public Overridable Function SelectTemplate(ByVal item As Object, ByVal container As DependencyObject)
            Return Nothing
        End Function
     
    End Class
    Cela fonctionne très bien mais lorsque je modifie la valeur de l'élément bindé, le listbox ne retourne pas dans le templateselector pour changer de template.
    Sauriez vous comment je pourrais le forcer à le faire svp ?

    Merci d'avance
    @+

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Quand tu fixes ta propriété TemplateSelectorProperty il faudra que tu parcours l'ensemble de tes ListBoxItem et que tu fixes leur ContentTemplate avec le nouveau template.

    Pour parcourir les ListBoxItems, il faut juste faire une boucle sur le nombre d'item de ta collection (Items.Count) et utiliser la méthode ItemContainerGenerator.ContainerFromIndex (qui te renvoie le ListBoxItem associé à l'index).

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Salut,

    Merci pour ta réponse mais ce n'est pas le problème en fait, j'ai du mal m'exprimer

    Le template selector fonctionne très bien, lorsque je sette la property TemplateSelectorProperty via le xaml (de la meme maniere que cela se fait en WPF appli lourde), puis que je balance ma liste de modeles en binding, les templates sont bien utilisés tels que j'en ai besoin : une propriété figurant dans le model permet le choix du template.
    Donc ce comportement, c'est le comportement je dirais "d'initialisation".
    Aucun besoin de parcourir les items, étant donné que la méthode PrepareContainerForItemOverride s'en charge toute seule.

    Par contre, pendant l'utilisation, admettons que j'aie un bouton sur un de mes templates permettant de modifier la property du model permettant le choix du template. Eh bien lorsque je clique sur ce bouton, je change ma property (exprès pour changer le template) mais rien ne se passe, je ne passe meme pas dans la fonction du templateselector. En gros, il faudrait que je fasse comprendre au listbox que quand mon objet change, il doit faire un refresh du template mais je ne vois pas comment faire.

    La rustine que j'ai trouvé pour le moment, c'est que quand je change la property de mon item, je retire l'item de la collection puis je le réinsère au même index et là, cela force le listbox à recréer le template qui va prendre en compte la nouvelle valeur de la property.

    Il y a des concepts pour lesquels je me demande vraiment ce que microsoft fait ! ca existe en WPF client lourd, pourquoi ne pas le mettre dans silverlight ? le pire c'est que c'est assez demandé sur la toile en plus...

    Any idea ?
    Merci.

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Le template selector fonctionne très bien, lorsque je sette la property TemplateSelectorProperty via le xaml (de la meme maniere que cela se fait en WPF appli lourde), puis que je balance ma liste de modeles en binding, les templates sont bien utilisés tels que j'en ai besoin : une propriété figurant dans le model permet le choix du template.
    Donc ce comportement, c'est le comportement je dirais "d'initialisation".
    Aucun besoin de parcourir les items, étant donné que la méthode PrepareContainerForItemOverride s'en charge toute seule.
    Effectivement, pas de problème sur ce point.

    La rustine que j'ai trouvé pour le moment, c'est que quand je change la property de mon item, je retire l'item de la collection puis je le réinsère au même index et là, cela force le listbox à recréer le template qui va prendre en compte la nouvelle valeur de la property.
    A la place de ta rustine, je récupererai Le ListBoxItem via ItemContainerGenerator.ContainerFromItem et ensuite je mettrai à jour le ContentTemplate de celui ci. Basiquement c'est la même idée que dans mon précédent post mais peut être n'ai-je pas bien compris le probleme.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Tu as à peu près compris le problème sauf que tu es un cran trop loin dans la chronologie lol !

    Prenons un cas concret : tu as une liste de Personnes (ObservableCollection(Of Personne)). Dans cette classe tu as une property Sexe de type enum.

    Ensuite, tu as ton listbox, bindé à cette liste, qui va t'afficher un template feminin ou un template masculin en fonction de la property sexe.

    Jusque là, tout va bien, le template selector va bien chercher les bons templates si je binde une liste déjà complétée, que je retire un item, que j'en ajoute un, c'est ok.

    Par contre, imaginons qu'il y ait eu une erreur sur le sexe d'une personne. Tu modifies cette property en live dans le template, ce qui va modifier la property sur laquelle est basée la selection de template. Au changement de cette property, rien ne se passe car aucun automatisme ne permet de dire "si cette property change en cours de route, Toi, listbox, tu devras aller voir dedans si tu dois changer son template".

    Donc par rapport à ce que tu dis, beh effectivement, tu as raison, il suffit d'aller rechercher le template, mais moi c'est l'avant qui m'interesse : comment dire au listbox que ma property sexe a changé pour qu'il se secoue et se mette a jour ?

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    OKy je pense avoir compris complétement cette fois ci

    Pour détecter les changements dans l'objet Personne je pense qu'on doit s'appuyer sur le fait qu'il doit descendre de INotifyPropertyChanged.

    Dans la methode override OnItemsChanged de ta ListBox tu peux t'abonner/desabonner aux objets INotifyPropertyChanged ajouté/remplacé/retiré, si ils sont de ce type.
    Les abonnements pointent vers une méthode qui teste la valeur changée et l'action à apporter. Dans ton cas, un changement de la propriété sexe renvoie à un changement de Template.

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

Discussions similaires

  1. jar executable fonctionne mais pas trop
    Par ng.phung dans le forum Langage
    Réponses: 6
    Dernier message: 02/05/2007, 09h26
  2. mysql fonctionne, mais pas avec un port
    Par spekal dans le forum Installation
    Réponses: 2
    Dernier message: 23/01/2007, 18h30
  3. [UBUNTU] La gravure fonctionne mais pas le démarrage
    Par khaskhos dans le forum Ubuntu
    Réponses: 12
    Dernier message: 18/01/2007, 15h37
  4. Flash - aperçu fonctionne mais pas swf seul
    Par LeBernie dans le forum Flash
    Réponses: 11
    Dernier message: 17/11/2006, 17h06
  5. [FLASH 8] : FLA qui fonctionne mais pas le SWF
    Par xtaze dans le forum Flash
    Réponses: 9
    Dernier message: 24/10/2006, 09h14

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