如何按 DataGrid WPF 上的图标编辑单元格?

问题描述

我试图将一个事件附加到铅笔图标上,它可以工作,但仅适用于在那一刻选择的行,即使不是按下铅笔的那一行,我希望事件发生仅按下铅笔图标,而不取决于选择了哪一行。 这是创建带有铅笔图标的列和堆栈面板的事件

<DataGridTemplateColumn Header="cinco" IsReadOnly="True">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding id4}" Foreground="#2ECBC6" FontSize="20" Margin="11,5" TextTrimming="WordEllipsis" />
                                <StackPanel PreviewMouseDown="StackPanel_PreviewMouseDown"  HorizontalAlignment="Right">
                                    <materialDesign:PackIcon Kind="LeadPencil" Foreground="#2ECBC6" Width="30" Height="30"/>
                                </StackPanel>
                            </StackPanel>
                        </DataTemplate>
                        
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridColumn.HeaderStyle>
                        <Style targettype="DataGridColumnHeader">
                            <Setter Property="Background" Value="Transparent"/>
                            <Setter Property="Foreground" Value="#2ECBC6"/>
                            <Setter Property="FontWeight" Value="Medium" />
                            <Setter Property="HorizontalAlignment" Value="Left" />
                            <Setter Property="HorizontalContentAlignment" Value="Center" />
                            <Setter Property="FontSize" Value="18"/>
                            <Setter Property="Margin" Value="15,0" />
                        </Style>
                    </DataGridColumn.HeaderStyle>
                </DataGridTemplateColumn>

这是按下铅笔图标时调用方法

private void StackPanel_PreviewMouseDown(object sender,MouseButtonEventArgs e)
    {
        test test1 = new test();
        test1 = (test)ListNameTest.SelectedItem;
        if (test1 == null)
        {
            MessageBox.Show("seleccionar fila");
        }
        else
        {
            var dato = test1.id4;
            Content_OrdenTrabajo.Text = dato.ToString();
            Host_OrdenTrabajo.IsOpen = true;
            Keyboard_OrdenTrabajo.KeyboardState = Rife.Keyboard.KeyboardState.Numeric;
            test1.id4 = Content_OrdenTrabajo.Text;
        }
    }

DataGrid example

解决方法

sender 方法的 StackPanel_PreviewMouseDown 参数将包含引发事件的 StackPanel。 由于此 StackPanel 是一个单元格元素,它的 DataContext 将从单元格继承。 并且单元格的 DataContext 是为其创建该行的集合项。

示例:

        private void StackPanel_PreviewMouseDown(object sender,MouseButtonEventArgs e)
        {
            var stackPanel = (StackPanel)sender;
            var rowData = stackPanel.DataContext;
        }

要获取属性值,您需要将 rowData 强制转换为 DataGrid.ItemsSource 集合的项目类型。

        test test1 = (test) ((FrameworkElement)sender).DataContext;