问题描述
我试图将一个事件附加到铅笔图标上,它可以工作,但仅适用于在那一刻选择的行,即使不是按下铅笔的那一行,我希望事件发生仅按下铅笔图标,而不取决于选择了哪一行。 这是创建带有铅笔图标的列和堆栈面板的事件
<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;
}
}
解决方法
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;