Datagrid,单击按钮时不显示详细信息

时间:2014-05-28 08:15:09

标签: c# wpf xaml

我有一个标准的数据网格定义< Datagrid的...> 在这个数据网格中,我还有标准的" rowdetails",所以当点击datagrid中的一行时,会显示详细信息。一切都按预期工作。

但是,我在datagrid的每一行中都有一个<按钮..>在适当的位置,问题是,当点击按钮时,我不希望显示该行的详细信息。如果在任何其他位置单击该行,则应正确显示详细信息,但是当按下该按钮时,它应该仅执行按钮内容,但不显示该行的详细信息。

如何实现这一目标?

到目前为止,我尝试将PreviewMouseDown事件附加到按钮,然后在代码后面:

    private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var button = (Button) sender;
        e.Handled = true;
    }

这样可以正确防止在单击按钮时显示数据网格行详细信息,但它也会阻止按钮本身执行其附加的Click事件方法。

2 个答案:

答案 0 :(得分:0)

在这里猜测:

单击鼠标按钮后,是否可以使行单击事件加速。例如,MouseClickUp而不是OnMouseClick。并且按钮甚至由OnMouseClick提升。也许然后首先调用按钮处理程序并解除行事件?

也许不是使用按钮你可以使用CellClick事件吗?

答案 1 :(得分:0)

您需要做的就是检查用户UIElementOnPreviewMouseDown处理程序中实际点击的内容:

private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    IInputElement element = e.MouseDevice.DirectlyOver;
    if (element != null && element is FrameworkElement)
    {
        Button button = GetParentOfType<Button>(element as FrameworkElement);
        if (button != null)
        {
            // The Button was clicked
        }
        else e.Handled = true;
    }
    else e.Handled = true;
}

GetParentOfType方法是一个简单的递归函数,它检查每个连续UIElement的父类型,如果找到则返回预期的类型:

public T GetParentOfType<T>(DependencyObject element) where T : DependencyObject
{
    Type type = typeof(T);
    if (element == null) return null;
    DependencyObject parent = VisualTreeHelper.GetParent(element);
    if (parent == null && ((FrameworkElement)element).Parent is DependencyObject)
        parent = ((FrameworkElement)element).Parent;
    if (parent == null) return null;
    else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type)) 
        return parent as T;
    return GetParentOfType<T>(parent);
}