У меня проблема с обнаружением ячейки, нажатой внутри DataGrid. DataGrid настроен как
<Setter Property="SelectionMode" Value="Single" />
<Setter Property="SelectionUnit" Value="Cell" />
Я использую DataGridTemplateColumns, и у каждого из них есть шаблон, который выглядит примерно так:
<DataGridTemplateColumn Header="...">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding SomeProperty}"
ContentTemplate="{StaticResource CellTemplate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataTemplate x:Key="CellTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="11" />
<ColumnDefinition Width="11" />
<ColumnDefinition Width="11" />
<ColumnDefinition Width="11" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0" ... />
<Border Grid.Column="1" ... />
<Border Grid.Column="2" ... />
<Border Grid.Column="3" ... />
</Grid>
</DataTemplate>
Обычно я могу получить в событии DataGrid MouseLeftButtonUp какую ячейку был нажат и его DataContext, либо через e.OriginalSource, либо через свойство dataGrid.SelectedCells.
Проблема возникает, когда пользователь каким-то образом нажимает кнопку «между ячейками», поэтому в e.OriginalSource сообщается о некотором ScrollViewer или даже DataGridRow. и dataGrid.SelectedCells пусто.
Я попытался удалить все границы вокруг ячеек, установив
<Setter Property="GridLinesVisibility" Value="None" />
Это мало что дало. Итак, есть ли способ, которым я всегда могу получить какую-нибудь ячейку, на которую нажали, или, по крайней мере, ближайшую возможную? Он не должен быть с точностью до 1 пикселя. Как и сейчас, похоже, что щелчки «проглатываются» всякий раз, когда вызывается MouseLeftButtonUp, а SelectedCells пуст, хотя у пользователя есть ощущение, что он щелкает в «области данных».