2009-08-26 7 views
1

Je construis un système de suivi des problèmes qui utilise Silverlight. J'utilise DataGrids pour afficher les listes de problèmes, définissez l'index sélectionné sur -1 afin qu'aucune ligne n'apparaisse sélectionnée, puis utilisez l'événement de modification de sélection pour afficher une fenêtre de détails de problème pour le problème sélectionné. Lorsque j'essaie d'actualiser le DataGrid en le reliant à sa ItemsSource, je désactiver l'événement SelectionChanged, relier le DataGrid à son ItemsSource, définir l'SelectedIndex à -1 et ensuite activer à nouveau l'événement SelectionChanged. Cependant, peu importe combien de temps je quitte la réactivation de l'événement SelectionChanged (même après l'événement DataGrid_Loaded), un événement SelectionChanged est déclenché et la fenêtre des détails du problème apparaît.Données Silverlight Datagrid Refresh avec la liaison SelectionChanged

Existe-t-il un meilleur moyen d'actualiser les données dans un DataGrid qui ne modifiera pas SelectedIndex? Sinon, existe-t-il un moyen de dire quels événements sont causés par un changement d'index programmatique et non par une interaction humaine?

(également pour la discussion, est-ce le meilleur contrôle pour le travail? J'ai besoin d'afficher plusieurs champs par ligne, comme le titre de l'émission, l'utilisateur affecté, demandé par l'utilisateur, le statut, etc.)

Merci d'avance.

Répondre

2

J'ai rencontré un problème similaire dans le passé avec les événements de sélection du contrôle ListView de comctl32: La sélection par programmation entraîne le déclenchement des événements de modification de sélection.

Ma solution de contournement pour ce problème est d'avoir une variable de compteur par grille/liste qui informe le gestionnaire d'événements s'il doit se soucier de l'événement de sélection ou non. Le code irait quelque chose comme:

int issueList_ProgrammaticEventCount_Selection = 0; 

void refreshIssueList() 
{ 
    ++issueList_ProgrammaticEventCount_Selection; 
    issueList.ItemsSource = ...; 
} 

void issueList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (issueList_ProgrammaticEventCount_Selection > 0) 
    { 
     --issueList_ProgrammaticEventCount_Selection; 
     return; 
    } 

    showIssueDetails(); 
} 
Questions connexes