首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DataGrid MouseLeftButtonDown未触发

WPF DataGrid MouseLeftButtonDown未触发
EN

Stack Overflow用户
提问于 2013-09-17 17:45:03
回答 2查看 4.6K关注 0票数 4

我有一个共同的任务。在DataGrid中一键实现CheckBox校验。我创建了一个从DataGrid派生的DataGridExtended类,并实现了类似的东西:

XAML:

代码语言:javascript
复制
<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>

代码:

代码语言:javascript
复制
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样式。

EN

回答 2

Stack Overflow用户

发布于 2013-09-17 19:29:06

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2013-09-17 18:14:42

尝试MouseDown事件,然后计算向右或向左

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18846470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档