数据网格行详细信息中的按钮需要两个 clik,解决方法会中断双击

本文关键字:clik 两个 解决 双击 中断 方法 详细信息 网格 数据网 按钮 数据 | 更新日期: 2023-09-27 18:33:08

我有一个DataGrid,上面有一个在RowDetailsTemplate中定义的按钮。问题是,单击按钮时,DataGrid 会使用第一次单击来选择行,因此您需要单击该按钮两次。

我已经尝试了这里提供的解决方法:wpf 行详细信息模板焦点:

XAML:

<DataGrid ItemsSource="{Binding SomeCollection}">
    <DataGrid.Resources>
        <Style TargetType="DataGridRow">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="SelectRowDetails"/>
            <Setter Property="DetailsVisibility" Value="{Binding HasCanadet, Converter={StaticResource BoolToVis}}"/>Mode=OneWay}"/>
        </Style>
    </DataGrid.Resources>
    ...
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
             ...
             <Button Command="{Binding SomeCommand}" ... '>
             ...
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
    ...
<DataGrid>

代码隐藏:

private void SelectRowDetails(object sender, MouseButtonEventArgs e)
{
    var row = sender as DataGridRow;
    if (row == null)
    {
        return;
    }
    row.Focusable = true;
    row.Focus();
    var focusDirection = FocusNavigationDirection.Next;
    var request = new TraversalRequest(focusDirection);
    var elementWithFocus = Keyboard.FocusedElement as UIElement;
    if (elementWithFocus != null)
    {
        elementWithFocus.MoveFocus(request);
    }
}

这很好用,但是我现在需要检测 DataGrid 行上的双击事件。我通过将 InputBindings 添加到 DataGrid 并将 SelectedItem 作为命令参数传递来做到这一点:

...
<DataGrid.InputBindings>
    <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding AnotherCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}" />
</DataGrid.InputBindings>
...

问题是双击仅在 RowDetails 上检测到(这很好),但在双击行本身时不会检测到(这不是)。

有什么想法吗?谢谢。

数据网格行详细信息中的按钮需要两个 clik,解决方法会中断双击

检查事件的源是否为 DataGridDetailsPresenter 类型

private void SelectRowDetails(object sender, MouseButtonEventArgs e)
{
    if(e.Source is DataGridDetailsPresenter) // Like this
    {
        var row = sender as DataGridRow;
        if (row == null)
        {
            return;
        }
        row.Focusable = true;
        row.Focus();
        var elementWithFocus = Keyboard.FocusedElement as UIElement;
        if (elementWithFocus != null)
        {
            elementWithFocus.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }            
}