PreviewMouseDown yöntemi here için bazı örnekler vardır.
Genel anlaşma, DataGrid.SelectedItem öğesini datagrid'in SelectionChanged işleyicisindeki orijinal değerine geri döndürmenin beklendiği gibi çalışmadığıdır; Çalışıyor gibi görünen tüm kod örnekleri, Dağıtımcının daha sonra zamanlamasını yapmasını isteyerek geri çekmeyi erteler.
Veri bölümünüzde bir CellStyle var mı? Benim için çalıştı aşağıdaki:
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>
codebehind:
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;
}
}
}
noktası SelectedCellsChanged olay SelectionChanged olaydan sonra ateş olmasıydı - ve özellikle de bu ayarı SelectedItem, salt okunur bir özellik olan SelectedCells'i doğru şekilde güncelleştirmez, bu nedenle daha fazla codebehind:
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;
}
}
Açıktır ki, işleyicilerin veri şebekesindeki ilgili olaylara bağlanması gerekir.
Bu, beklenen gibi çalıştı, istenirse seçim değişikliğini düzgün bir şekilde iptal etti ve bir titreme oluşturmadı.
Eski öneri mükemmel çalıştı (ikincisi çok ilginç bir öneri olsa da ve bunu denemeyi de düşündüm) - Teşekkür ederim. – Mani5556