gpt4 book ai didi

WPF DataGrid MouseLeftButtonDown 不触发

转载 作者:行者123 更新时间:2023-12-03 22:49:33 26 4
gpt4 key购买 nike

我有一个共同的任务。一键实现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>

代码:
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 样式...

最佳答案

在 WPF 中,我们经常会遇到以下情况:特定的 Click处理程序似乎不起作用。其原因通常是因为控件(或我们自己的代码)正在处理该事件并设置 e.Handled = true; ,这会阻止事件进一步传递。在这些情况下,人们普遍认为您应该在这种情况发生之前尝试访问该事件,因此我们转向匹配/相关 Preview事件。

在您的情况下,我建议您使用 PreviewMouseLeftButtonDown事件。你说到那时某些东西还没有初始化,但这对我来说没有任何意义。你说你需要保存以前的值,但你可以通过你的 DataGridExtendedMouseLeftButtonUp 来做到这一点。事件处理程序。

当用户第一次释放鼠标按钮时,您就拥有了他们的新值。将其保存在变量中。当用户在下一次和随后的每次释放鼠标按钮时,将他们从变量中的先前值保存为旧值,然后将他们的新值读入变量中。

关于WPF DataGrid MouseLeftButtonDown 不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18846470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com