c# - DataGrid RowDetails 中的按钮需要两次单击,解决方法会中断双击

标签 c# wpf datagrid

我有一个 DataGrid,其中有一个在 RowDetailsTemplate 中定义的按钮。问题是,当单击按钮时,第一次单击被 DataGrid 消耗以选择行,因此您需要单击按钮两次。

我已经尝试过此处提供的解决方法:wpf RowDetailsTemplate focus :

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 上检测到双击(这很好),但在双击行本身时则不会检测到双击(这不是)。

有什么想法吗? 谢谢。

最佳答案

检查事件源的类型是否为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));
        }
    }            
}

关于c# - DataGrid RowDetails 中的按钮需要两次单击,解决方法会中断双击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35182396/

相关文章:

c# - 将 10 进制数转换为 .NET 中任意进制数的最快方法?

c# - Azure Rest api放置blob

c# - WPF 数据网格 : Issue regarding virtualization of selected cells outside of visible area

WPF DataGrid 绑定(bind)到 string.Length 而不是字符串文本

c# - 使用文本文件中的三个项目的批处理命令

c# - 使 gridview 数据源保留在界面中而不是向下转换为对象

C# - MVVM 中的第二个选项卡项中不显示弹出窗口

c# - 防止矩形样式应用于 DataGrid

wpf - XAML 中的错误 - "Style"的 TypeConverter 不支持从字符串进行转换

c# - 在WPF中更新动态数据显示图表的有效方法