如何从资源中的控件发送的事件中获取父控件

时间:2012-09-28 13:05:02

标签: c# wpf xaml contextmenu

我在Datarid的资源中定义了一个上下文菜单。在上下文菜单的Click事件中,我想检查父控件(DataGrid)的名称。我尝试了VisualTreeHelper.GetParent()和LogicalTreeHelper.GetParent(),但都没有反映xaml中的层次结构。如何从Click事件获取DataGrid控件?谢谢你的回答。

代码:

private void datagridTargetDelete_Click(object sender, RoutedEventArgs e)
{
    // Check the name of the DataGrid here...
}

XAML:

<DataGrid Name="datagridTarget">
    <DataGrid.Resources>
        <ContextMenu x:Key="DGTContextMenu">
            <MenuItem Header="Delete" Click="datagridTargetDelete_Click">
                <MenuItem.Icon>
                    <Image Height="16" Width="16" Source="{Binding ContextDeleteIcon}"/>
                </MenuItem.Icon>
            </MenuItem>
        </ContextMenu>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="" Width="Auto" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image ContextMenu="{DynamicResource DGTContextMenu}" Height="16" Width="16" Source="{Binding ObjectImage}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

2 个答案:

答案 0 :(得分:2)

这将为您提供您想要的确切内容:

var parent = ((ContextMenu)((MenuItem)sender).Parent).PlacementTarget;

答案 1 :(得分:0)

在这种情况下,您可能需要考虑在父元素上使用CommandBinding的RoutedCommand。我认为这实际上是如何使用ContextMenu的。这样,WPF将为您找到父对象,您不必在逻辑树中搜索它。