2011-06-21 9 views
12

I utiliza MVVM y Ato cuadrícula de datos a la colección con algo de código:Datagrid.IsSelected Encuadernación y el desplazamiento

<DataGrid ItemsSource="{Binding Entites}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" 
        SelectedItem="{Binding SelectedEntity}"> 

Y yo aslo unión a IsSelectedProperty usando el estilo (o RowStyle ItemContainerStyle)

<DataGrid.RowStyle> 
     <Style> 
       <Setter Property="DataGridRow.IsSelected" Value="{Binding IsSelectedProperty, Mode=TwoWay}" />       
     </Style> 
</DataGrid.RowStyle> 

uso Funciona bien. Pero si desplazo la cuadrícula de datos hacia arriba y hacia arriba, deja de funcionar.

Respuesta

1

¿Hay alguna razón particular por la que esté vinculando en el RowStyle? Siempre he vinculado mi SelectedItem directamente a mi propiedad SelectedEntity en mi ViewModel.

+0

Sí. La razón es multiselección. – vitidev

+0

Ah. Para eso acabo de crear una propiedad de dependencia llamada MultiSelect o SelectedItems o algo. [enlace aquí] (http://forums.silverlight.net/forums/p/199937/467373.aspx) –

+0

Seguí su enlace e intento implementar el ejemplo en la cuadrícula de datos. Pero no pude conseguir que actualice la propiedad "SelectedItems" en mi viewmodel – vitidev

16

Me encontré con este problema, y ​​el motivo fue que DataGrid usaba virtualización: cuando desplaza un DataGridRow seleccionado fuera de la pantalla, el elemento visual DataGridRow se destruye y se crea uno nuevo, o bien, si la propiedad DataGrid's VirtualizingStackPanel.VirtualizationMode está configurado en Recycling - se reutiliza para cualquier fila que ingrese a la ventana gráfica.

Cuando se produce un evento, el enlace entre su ViewModel (con su conjunto de propiedades IsSelectedProperty) y DataGridRow (con su conjunto de propiedades IsSelected) se rompe.

Para confirmar este es el caso, intente establecer la propiedad EnableRowVirtualization del DataGrid en falso.

En mi caso, necesitaba el rendimiento requerido mediante el uso de la virtualización, y terminó la implementación de la capacidad de selección utilizando Attached Behaviors: en concreto, un clic en una fila usaría un comportamiento LeftClickCommand adjunta para invocar un comando delegado en el modelo de vista que establece IsSelectedProperty. Luego utilicé un DataTrigger vinculado a IsSelectedProperty en el estilo DataGridRow para resaltar la fila.

Esta solución básicamente implica rodar su propio mecanismo de selección, pero fue la única forma que encontré para obtener tanto la virtualización de fila como la selección de fila MVVM.

+0

Muy extraño. Me escriben sobre virtualización sobre el tema, pero el texto desapareció. Sí, esta es la razón. Ahora resolví el problema escribiendo código en código subyacente. Necesito una selección múltiple. ¿Se activa el evento al seleccionar con el botón "Shift" presionado? – vitidev

+0

Agregué un comportamiento 'Control-Click' para que se puedan seleccionar múltiples filas de a una por vez. Usar 'Shift' para seleccionar un rango sería posible, pero no fue lo suficientemente útil en mi caso particular como para justificar el manejo del comportamiento de esquina de cada caso. –

+0

¿Puedes agregar un ejemplo de DataTrigger? – KrisTrip

6

Intente establecer el modo de virtualización en estándar en DataGrid: VirtualizingStackPanel.VirtualizationMode="Standard".

Creo que la virtualización está activada por defecto, pero el modo está reciclando. Por lo tanto, la propiedad IsSelected por algún motivo no se vuelve a evaluar cuando se crea una nueva fila en scroll.

+0

¡Muchas gracias! ¡Me ayudó! Después de buscar mucho vine aquí, realmente te agradezco. –