2009-11-26 25 views
7

Tengo una cuadrícula de datos con una columna que contiene una casilla de verificación. Quiero cambiar el valor de la propiedad seleccionada con destino cuando se hace clic en la fila:Fila de cuadrícula de datos de Silverlight Haga clic en

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

NOTA: No quiero utilizar el evento SelectedItemChanged porque esto no funciona correctamente cuando sólo hay una fila en la grilla.

+0

¿Desea alternar cuándo se hace clic en la fila nuevamente? ¿Hay algún lugar en la fila donde el clic no debería tener este efecto? – AnthonyWJones

Respuesta

7

Como es a menudo la forma que he encontrado mi propia solución para esto:

Añadir un evento MouseLeftButtonUp a la cuadrícula de datos:

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

Y walk the visual tree para obtener la fila de la cuadrícula de datos:

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 vez encontrado, es un enfoque simple para alternar la propiedad IsSelected enlazado :-)

Espero que esto ayude a otra persona.

+0

Me gusta su solución. Tiene un poco más de sentido que el mío. Aunque, me pregunto de dónde sacaste esta clase 'MyDependencyObjectHelper'. Supongo que es tu código personalizado. ¿Te importa compartirlo? –

+0

Está vinculado en la respuesta debajo de "Walk the visual tree". Esto ayudó, Mark –

+0

+1 ¡Gran solución! Pasé 3 horas tratando de hackear una grilla para "seleccionar automáticamente" una casilla de verificación y no encontré nada tan elegante. –

0

Aquí es una solución aún más simple

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: este, así como otro ejemplo asume su clase que va a enlazar a los instrumentos de control INotifyPropertyChanged

Cuestiones relacionadas