WPF DataGrid MouseLeftButtonDown не стреляет
У меня общая задача. Реализуйте проверку CheckBox в DataGrid одним щелчком мыши. Я хочу создать класс DataGridExtended, производный от DataGrid, и реализовать что-то подобное:
XAML:
<DataGrid x:Class="DataGrid.DataGridExtended"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
</DataGrid>
КОД:
public partial class DataGridExtended : System.Windows.Controls.DataGrid
{
private int _oldRowIndex;
private int _oldColumnIndex;
public DataGridExtended()
{
MouseLeftButtonUp += DataGridExtendedMouseLeftButtonUp;
MouseLeftButtonDown += DataGridExtendedMouseLeftButtonDown;
}
private void DataGridExtendedMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Если сендер реально DataGridExtended
var dataGridExt = sender as DataGridExtended;
if (dataGridExt == null)
return;
// Получаем текущую ячейку
var currentCell = dataGridExt.CurrentCell;
_oldRowIndex = dataGridExt.SelectedIndex;
_oldColumnIndex = dataGridExt.CurrentColumn.DisplayIndex;
}
private void DataGridExtendedMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
// Если сендер реально DataGridExtended
var dataGridExt = sender as DataGridExtended;
if (dataGridExt == null)
return;
var rowIndex = dataGridExt.SelectedIndex;
var columnIndex = dataGridExt.CurrentColumn.DisplayIndex;
// Получаем текущую ячейку
var currentCell = dataGridExt.CurrentCell;
//if (_oldRowIndex != rowIndex || _oldColumnIndex != columnIndex)
// return;
// Получаем текущую колонку
var currentColumn = currentCell.Column;
// Получаем контент текущей ячейки
var cellContent = currentColumn.GetCellContent(currentCell.Item);
// Если кликнули по чекбоксу
var checkBox = cellContent as CheckBox;
if (checkBox == null)
return;
// Ставием его в фокус
checkBox.Focus();
// Меняем чек на противоположный
checkBox.IsChecked = !checkBox.IsChecked;
// Получаем выражение привязки для чекбокса
var bindingExpression = checkBox.GetBindingExpression(ToggleButton.IsCheckedProperty);
// Если привязка есть - обновляем ее
if (bindingExpression != null)
bindingExpression.UpdateSource();
}
}
Обработчик DataGridExtendedMouseLeftButtonUp работает нормально, но DataGridExtendedMouseLeftButtonDown не запускается. И это проблема.
Без вызова DataGridExtendedMouseLeftButtonDown проверка поведения - это не то, что мне нужно. А именно, проверка работает, даже когда я перемещаю курсор из сетки:E Попытка использовать PreviewMouseLeftButtonDown вместо MouseLeftButtonDown дает неправильный эффект:(
Итак, как я могу решить мою проблему? Не предлагайте использовать разные подходы для реализации проверки одним щелчком мыши, плз:) Как, например, использование стиля XAML...
2 ответа
В WPF часто возникают ситуации, когда Click
обработчик, кажется, не работает. Причина этого обычно заключается в том, что элемент управления (или наш собственный код) обрабатывает это событие и установку e.Handled = true;
, который останавливает событие от дальнейшей передачи. В этих ситуациях общепринято, что вы должны попытаться получить доступ к событию до того, как это произойдет, и поэтому мы обращаемся к соответствию Preview
событие.
В вашей ситуации я бы порекомендовал вам использовать PreviewMouseLeftButtonDown
событие. Вы сказали, что что-то не инициализировано к тому времени, но это не имеет никакого смысла для меня. Вы сказали, что вам нужно сохранить предыдущее значение, но вы можете сделать это только из вашего DataGridExtendedMouseLeftButtonUp
обработчик события.
Когда пользователь отпускает кнопку мыши в первый раз, тогда у вас появляется новое значение. Сохраните это в переменной. Когда пользователь отпускает кнопку мыши в следующий и каждый последующий раз, затем сохраните свое предыдущее значение из переменной как старое значение, а затем считайте свое новое значение в переменную.
Пытаться MouseDown
событие, а затем выяснить, вправо или влево