我有一个共同的任务。通过一键实现DataGrid中的CheckBox检查。我希望创建一个从DataGrid派生的DataGridExtended类,并实现类似的东西:
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>
CODE:
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会产生错误的效果:(
那么,我该如何解决我的问题呢?不要提供使用不同的方法来实现一键检查plz :)比如使用XAML样式...
答案 0 :(得分:4)
在WPF中,我们经常遇到特定Click
处理程序似乎不起作用的情况。这样做的原因通常是因为控件(或我们自己的代码)正在处理该事件并设置e.Handled = true;
,这会阻止事件进一步传递。在这些情况下,通常会接受您应该尝试在之前访问事件,因此我们转向匹配/相关的Preview
事件。
在您的情况下,我建议您使用PreviewMouseLeftButtonDown
事件。你说当时没有初始化某些东西,但这对我没有任何意义。您说您需要保存以前的值,但是您可以从DataGridExtendedMouseLeftButtonUp
事件处理程序中执行此操作。
当用户第一次释放鼠标按钮时,您将获得新值。将其保存在变量中。当用户在下一个和每个后续时间释放鼠标按钮时,将其先前的值保存为变量作为旧值,然后将其新值读入变量中。
答案 1 :(得分:0)
尝试MouseDown
事件然后向右或向左计算