2009-11-26 15 views
7

Ho un datagrid con una colonna contenente una casella di controllo. Voglio cambiare il valore della proprietà Selected vincolato quando la riga viene cliccato:Silverlight Datagrid Row Click

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

NOTA: Non voglio utilizzare l'evento SelectedItemChanged perché questo non funziona correttamente quando v'è una sola fila nella griglia.

+0

Si desidera commutare quando si fa nuovamente clic sulla riga? C'è un posto sulla fila dove fare clic non dovrebbe avere questo effetto? – AnthonyWJones

risposta

7

Come è spesso il modo che ho trovato la mia soluzione per questo:

Aggiungere un evento MouseLeftButtonUp al DataGrid:

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

E walk the visual tree per ottenere la riga griglia di dati:

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; 
       } 

      } 

Una volta trovato, è un semplice approccio per attivare la proprietà IsSelected associata :-)

Spero che questo aiuti qualcun altro.

+0

Mi piace la tua soluzione. Ha un po 'più senso del mio. Anche se, mi chiedo da dove hai preso questa classe 'MyDependencyObjectHelper'. Presumo che sia il tuo codice personalizzato. Cura di condividerlo? –

+0

È collegato nella risposta sotto "Walk the visual tree". Questo mi ha aiutato, Mark –

+0

+1 Ottima soluzione! Ho passato 3 ore cercando di hackerare una griglia per "selezionare automaticamente" una casella di controllo e non ho trovato nulla di altrettanto elegante. –

0

Ecco una soluzione ancora più semplice

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; 
} 

Nota: questo così come l'altro esempio presuppone la classe che si sono vincolanti per gli strumenti di controllo InotifyPropertyChanged