2009-11-26 7 views
7

J'ai une grille de données avec une colonne contenant une case à cocher. Je souhaite modifier la valeur de la propriété sélectionnée liée lorsque la ligne est cliqué:Silverlight Datagrid Row Cliquez sur

alt text http://lh4.ggpht.com/_L9TmtwXFtew/Sw6YtzRWGEI/AAAAAAAAGlQ/pntIr2GU6Mo/image_thumb%5B3%5D.png

NOTE: Je ne veux pas utiliser l'événement SelectedItemChanged parce que cela ne fonctionne pas correctement quand il n'y a qu'un seul rangée dans la grille.

+0

Voulez-vous basculer lorsque la ligne est de nouveau cliquée? Y at-il quelque part sur la ligne où le clic ne devrait pas avoir cet effet? – AnthonyWJones

Répondre

7

Comme souvent la façon dont je l'ai trouvé ma propre solution pour cela:

Ajouter un événement MouseLeftButtonUp au DataGrid:

<data:DataGrid x:Name="dgTaskLinks" 
ItemsSource="{Binding TaskLinks}" 
SelectedItem="{Binding SelectedTaskLink, Mode=TwoWay}" 
MouseLeftButtonUp="dgTaskLinks_MouseLeftButtonUp" 
>... 

Et walk the visual tree pour obtenir la ligne de grille de données:

private void dgTaskLinks_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
      { 
       ///get the clicked row 
       DataGridRow row = MyDependencyObjectHelper.FindParentOfType<DataGridRow>(e.OriginalSource as DependencyObject); 

       ///get the data object of the row 
       if (row != null && row.DataContext is TaskLink) 
       { 
        ///toggle the IsSelected value 
        (row.DataContext as TaskLink).IsSelected = !(row.DataContext as TaskLink).IsSelected; 
       } 

      } 

Une fois trouvé, il s'agit d'une approche simple pour basculer la propriété IsSelected liée :-)

Espérons que cela aide quelqu'un d'autre.

+0

J'aime votre solution. Cela a un peu plus de sens que le mien. Bien, je me demande où vous avez obtenu cette classe 'MyDependencyObjectHelper'. Je suppose que c'est votre code personnalisé. Vous voulez le partager? –

+0

Il est lié dans la réponse sous "Walk the visual tree". GLad cela a aidé, Mark –

+0

+1 Grande solution! J'ai passé 3 heures à essayer de pirater une grille pour "sélectionner automatiquement" une case à cocher et n'a pas trouvé quelque chose d'aussi élégant. –

0

Voici une solution

XAML

<data:DataGrid 
x:Name="dgMyDataGrid" 
ItemsSource="{Binding MyList}" 
SelectedItem="{Binding MyList, Mode=TwoWay}" 
MouseLeftButtonUp="dgMyDataGrid_MouseLeftButtonUp">... 

CS

private void dgMyDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    DataGrid dg = (sender as DataGrid); 
    var allObjects = dg.DataContext as List<MyCustomObject>; 
    foreach(var o in allObjects) 
    { 
      o.Selected = false; 
    } 

    MyCustomObject SelectedObject = (MyCustomObject)dg.SelectedItem; 
    SelectedObject.Selected = true; 
} 

Notez encore plus simple: cela aussi bien que l'autre exemple suppose votre classe que vous liez aux outils de contrôle INotifyPropertyChanged