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