Bonjour,

En très résumé, lors d'un changement par code du contenu d'une grille, il m'est impossible d'en rafraichir le contenu.

En beaucoup plus détaillé:

Sur une page j’ai deux grilles, l’une de Catégories et l’autre de Vêtements.
Une catégorie contient zéro à n vêtements.
Ma page doit permettre d’entrer de nouvelles catégories et de nouveaux vêtements.
L’utilisateur doit être capable de classer les vêtements d’une catégorie dans l’ordre qu’il souhaite.
J’ai donc mis dans ma table vêtements un champ « VetOrdre » qui me permet de retenir l’ordre dans lequel les vêtements sont classés.
J’ai donc par exemple pour la catégorie « Chemises » les vêtements suivants :
(Identifiant, libellé, ordre)
3 Chemise en soie 0
1 Chemise en coton 1
2 Chemise en lin 2
En dessous de ma grille, j’ai un bouton « remonte » qui me permet de changer l’ordre du vêtement actuellement sélectionné.
Sur l’exemple précédent, si je suis positionné sur "Chemise en coton" et que je pousse sur "remonte", je vais obtenir :
1 Chemise en coton 0
3 Chemise en soie 1
2 Chemise en lin 2
L’action qui se passe dans « remonte » est la suivante :
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
Private Sub btnRemonteVetement_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        If GrilleVetement.SelectedItem Is Nothing Then Return
        'doit d'abord découvrir si le vêtement sélectionné n'est pas le premier de la liste
        If CType(GrilleVetement.SelectedItem, Vetement).VetOrder > 0 Then
            'je diminue l'ordre du vêtement sélectionné de 1
            CType(GrilleVetement.SelectedItem, Vetement).VetOrder -= 1
            'je me positionne sur le vêtement précédent
            GrilleVetement.SelectedIndex -= 1
            'j'augmente l'ordre du vêtement précédent de 1
            CType(GrilleVetement.SelectedItem, Vetement).VetOrder += 1
            'je me positionne à nouveau sur le vêtement original
            GrilleVetement.SelectedIndex += 1
 
            'je sauve mes changements d'ordre
            save()
            'je tente de rafraichir l'écran
            RefreshGrilleVetement(Me.GrilleCategories.SelectedItem.CatId())
       End If
    End Sub
Bien que l’ordre à bien été changé dans ma table, et malgré la fonction RefreshGrilleVetement, à l’écran, aucun rafraichissement de la grille n’a eu lieu et c’est encore l’ancien ordre qui apparait.
Voici le code de ma fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Private Sub RefreshGrilleVetement(ByVal maCategId As Integer)
 
        CType(source.DomainContext, LaundryContext).Vetements.Clear()
        GrilleVetement.ItemsSource = Nothing
 
 
        Me.GrilleVetement.ItemsSource = CType(source.DomainContext, LaundryContext).Vetements
 
        source.DomainContext.Load(CType(source.DomainContext, LaundryContext).GetVetementsByCatIdQuery(maCategId))
 
    End Sub
Il faut encore savoir que « GetVetementsByCatIdQuery(maCategId) » me retourne tous les vêtements d’une catégorie classés par « VetOrdre »
La seule méthode pour rafraichir ma grille est de me positionner sur une autre catégorie, (par exemple « Pantalons », et de revenir sur ma catégorie « Chemises ».
Et pourtant, ….
Le code utilisé lors d’un changement de catégorie est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Private Sub GrilleCategories_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
        If GrilleCategories.SelectedItem Is Nothing Then Return       
 
        RefreshGrilleVetement(Me.GrilleCategories.SelectedItem.CatId)
 
 
    End Sub
Et il utilise donc la même fonction que précédemment !

Pour être tout à fait complet, voici la définition xaml de ma grille :
<dataataGrid x:Name="GrilleVetement" a AutoGenerateColumns="False" RowEditEnded="GrilleVetement_RowEditEnded" ItemsSource="{Binding DomainContext.Vetements, ElementName=source}">
Si quelqu'un a une idée, elle est la bienvenue.