2011-07-26 12 views
8

He investigado esto y estoy perplejo: tengo un WGD DataGrid y el uso de un modelo de MVVM. Quiero, en determinadas circunstancias, evitar la posibilidad de cambiar una fila en el DataGrid. Investigué esto y probé técnicas como la que encontré here.prevención de cambio de fila en la cuadrícula de datos

En la práctica, esto funciona, pero hay un "parpadeo" indeseable (selecciona la fila cliqueada por un momento y luego vuelve a la selección anterior), mientras que esta es una solución cercana ojalá hubiera una manera más elegante como evitar el cambio de fila en primer lugar.

Me sorprende que no haya SelectionChanging o BeforeSelectionChanged para poder cancelar el evento de la activación; y evitar por la fuerza el cambio de índice en mi modelo de vista no parece hacer ninguna diferencia.

¿Cómo puedo hacer esto?

Gracias.

Respuesta

5

¿Qué ocurre si toma los eventos previewkeydown y previewmousedown y simplemente llama al e.Handled=true bajo ciertas circunstancias?

Editar: para satisfacer el estilo MVVM: puede crear un Behavior con un DependencyProperty puede enlazar a su circunstancia. en este comportamiento puede manejar los eventos y tal vez algunas otras cosas, como hace el usuario haga clic en un datarow o encabezado ...

+0

La primera sugerencia funcionó a la perfección (aunque esta última es una sugerencia muy interesante y también he considerado probarla) - Gracias. – Mani5556

2

DispatcherPriority se ha establecido en ContextIdle. Esto hace que parpadee, ya que su SelectedItem está configurado dos veces (y se ha representado dos veces). Solo establece la prioridad en Normal, y ya no parpadearás más.

+0

Esto me ayudó, gracias. –

0

Existen algunos ejemplos para el método PreviewMouseDown here.

El acuerdo general es que revertir el elemento DataGrid.SelectedItem de nuevo a su valor original dentro del controlador SelectionChanged de la cuadrícula de datos no funciona como se esperaba; todos los ejemplos de código que parecen funcionar posponen la inversión pidiéndole al distribuidor que lo programe más tarde.

¿Tiene un CellStyle en su cuadrícula de datos? Para mí, los siguientes trabajó:

xaml:

<DataGrid.CellStyle> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="Background" Value="DarkSlateBlue"/> 
       <Setter Property="Foreground" Value="White"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

código subyacente:

private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (e.AddedItems.Count > 0) 
    { 
     object x = e.AddedItems[0]; 
     if (x is MyObjectType && x != myViewModel.CurrentItem && 
      myViewModel.ShouldNotDeselectCurrentItem()) 
     { 
      // this will actually revert the SelectedItem correctly, but it won't highlight the correct (old) row. 
      this.MyDataGrid.SelectedItem = null; 
      this.MyDataGrid.SelectedItem = myViewModel.CurrentItem; 
     } 
    } 
} 

El punto fue que el evento SelectedCellsChanged despedido después del evento SelectionChanged - y, en particular, que el establecimiento de la SelectedItem no actualiza correctamente las SelectedCells que son una propiedad de solo lectura, por lo que hay más código detrás:

private void MyDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
{ 
    List<DataGridCellInfo> selectedCells = MyDataGrid.SelectedCells.ToList(); 

    List<MyObjectType> wrongObjects = selectedCells.Select(cellInfo => cellInfo.Item as MyObjectType) 
     .Where (myObject => myObject != myViewModel.CurrentItem).Distinct().ToList(); 
    if (wrongObjects.Count > 0) 
    { 
     MyDataGrid.UnselectAllCells(); 
     MyDataGrid.SelectedItem = null; 
     MyDataGrid.SelectedItem = myViewModel.CurrentItem; 
    } 
} 

Obviamente, los controladores deben estar conectados a los eventos correspondientes en la cuadrícula de datos.

Esto funcionó como se esperaba, se canceló correctamente el cambio de selección si se desea y no produjo un parpadeo.

Cuestiones relacionadas