2008-11-18 12 views
4

Y at-il un moyen de désactiver la sélection automatique de la première ligne dans le DataGrid intégré dans Silverlight?Silverlight DataGrid sélection automatique lors de la définition de ItemSource/DataContext, tri,

Nous construisons beaucoup de fonctionnalités basées sur l'utilisateur en sélectionnant une ligne dans une grille de données. Le déclenchement automatique de SelectionChanged lorsque la liaison de données ou le tri nous cause vraiment des problèmes. Nous avons essayé de placer des gardes autour de la sélection, mais nous n'arrivons pas à résoudre tous les problèmes. Par exemple, si vous avez DataGrid dans un onglet d'un TabControl qui n'est pas affiché lors du chargement de l'écran et le DataGrid a une liaison à une propriété du DataContext qui est une liste d'objets. La grille n'est pas databound tant que l'onglet n'est pas affiché. Y a-t-il un événement nous indiquant que la grille est la liaison de données? Le comportement par défaut de la liaison de données ne doit-il pas être de sélectionner une ligne?

Merci Mike

Répondre

0

Depuis le code de la DataGrid est disponible auprès de Microsoft, Nous avons supprimé la sélection afin que nous n'ayons pas à la contourner. Je crois que ce n'est plus un problème avec la grille Silverlight 3.0.

1

Mike,

J'ai résolu ce problème en enveloppant le contrôle des fenêtres, et attrapant la sélection événement changé de la grille de fenêtres emballés.

Dans votre contrôle, raccordez l'événement Loaded de votre contrôle et, une fois chargé, définissez une variable de membre privé booléenne sur true. Ensuite, lorsque vous interceptez l'événement de sélection de la grille de données interne, ne faites que soulever votre propre événement modifié si vous contrôlez est chargé. Lorsque cela est fait, vous pouvez maintenant revenir au sous-élément OnApplyTemplate et définir l'index sélectionné de votre grille de données interne sur -1 et l'élément sélectionné sur rien. Étant donné que le réglage de l'index et de l'élément aura lieu avant que le contrôle ne soit terminé, l'événement modifié par sélection ne se déclenchera pas. J'ai essayé ceci dans un environnement à onglets et sans tabulation, et cela semble fonctionner sans problème. Maintenant, pour un problème un peu plus difficile, vous avez peut-être remarqué que lorsque vous triez la grille de données Windows (alors que ce sont des données liées à un ItemsSource), elle sélectionne toujours l'élément supérieur des données affichées. Ceci, bien sûr, déclenchera la sélection de l'événement modifié, et passera à un élément qui n'a pas été précédemment sélectionné, et autant que je peux voir, ne devrait pas être sélectionné. Pour gérer cela, vous devrez faire un codage un peu plus compliqué. Si vous remarquez que lorsque vous interceptez l'événement de sélection de la grille interne et que vous observez l'élément sélectionné, il n'y a que quelques cas où l'élément sélectionné n'est défini sur rien, c'est-à-dire lorsqu'il n'y a plus d'élément sélectionné. la sélection est effacée) ou lorsque (HINT) les colonnes sont triées. Lorsque vous effectuez un tri, deux événements se déclenchent: la désélection de l'élément (SelectedItem is Nothing) et la sélection de l'élément supérieur dans la liste (SelectedIndex 0). Maintenant, si vous deviez placer un drapeau dans le gestionnaire d'événements pour la sélection des grilles internes, et que l'élément ne correspond à rien, vous pouvez suivre l'élément sélectionné précédemment, puis définir l'élément sélectionné de la grille de données interne. à l'élément précédemment sélectionné. Cela résout bien le problème, et comme toujours, il peut y avoir des résultats indésirables lors de l'emballage d'un contrôle Windows, mais pour autant que je sache, cela semble être le seul moyen de contourner la première ligne sélectionnée en charge problème. Je peux seulement imaginer, cependant, que cela va être fixé par M $ à un moment donné.

J'espère que cette aide,

Merci,

Scott

3

Avez-vous essayé de placer un champ booléen (ex. Bool dataGridFirstLoad) que vous définissez false dans le constructeur de votre contrôle utilisateur.

Ensuite, dans l'événement SelectionChanged du DataGrid, vérifiez si dataGridFirstLoad est false.Si false, définissez la valeur sur true et définissez SelectedItem sur null.

Espérons que cela aide.

0

Le code ci-dessous devrait le faire (ensemble JustRefreshed true lorsque vous mettez à jour/actualiser la grille):

int LastSelectedIndex = -1; 
bool JustRefreshed = false; 

     private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (JustRefreshed) 
      { 
       JustRefreshed = false; 
       dataGrid.SelectedIndex = LastSelectedIndex; 
       return; 
      } 
      if (e.AddedItems.Count > 0) 
      { 
       LastSelectedIndex = dataGrid.SelectedIndex; 
         }  
       //Your logic comes here... 
      } 
     } 
1

ce qui est similaire aux postes ci-dessus (et hash sur la suggestion de Paulo T). Cela fonctionne bien. // définir le gestionnaire selectionChanged dans le XAML ou dans le constructeur // J'ai 2 grilles sur ma page, donc je crée une propriété booléenne pour chaque

private bool IsFirstLoad { get; set; } 
private bool IsFirstLoadDetails { get; set; } 
public BookDisplay() 
{ 
    //code here 
    this.IsFirstLoad = true; 
    this.IsFirstLoadDetails = true; 
    BindBooks(); //define this function (not in this snippet for the sake of brevity) 
} 
private void GridBooks_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (this.IsFirstLoad) 
    { 
    GridBooks.SelectedItem = -1; 
    this.IsFirstLoad = false; 
    } 
    else 
    { 
    //do your stuff 
    } 
} 
private void GridBooksWithDetails_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (this.IsFirstLoadDetails) 
    { 
    GridBooksWithDetails.SelectedItem = -1; 
    this.IsFirstLoadDetails = false; 
    } 
}