MenuItem_Click'无效.'Click'不是'System.Windows.Controls.DataGridTextColumn上的事件

Ben*_*udo 2 wpf datagrid click

当我尝试编译以下WPF DataGrid代码时,Visual Studio会抱怨"'MenuItem_Click'无效.'Click'不是'System.Windows.Controls.DataGridTextColumn'上的事件."

    <DataGrid x:Name="myDataGrid" ItemsSource="{Binding myItems}" AutoGenerateColumns="False">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Header="Header Text" Click="MenuItem_Click"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.ColumnHeaderStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Header="c1" Binding="{Binding C1}" />
            <DataGridTextColumn Header="c2" Binding="{Binding C2}" />
            <DataGridTextColumn Header="c3" Binding="{Binding C2}" />
        </DataGrid.Columns>
    </DataGrid>
Run Code Online (Sandbox Code Playgroud)

Click处理程序在MenuItem上定义,而不是在DataGridTextColumn上定义.为什么让这个Click处理程序破坏DataGrid?

小智 7

XAML找不到MenuItem_Click,因为<Style>创建了一个新的XAML名称范围(有关名称范围的解释,请参阅WPF XAML Namescopes).XAML仅在封闭的名称范围内查找事件处理程序名称.

为了解决问题,请移动ContextMenu到资源,如下所示:

<DataGrid x:Name="myDataGrid" ItemsSource="{Binding myItems}" AutoGenerateColumns="False">
    <DataGrid.Resources>
        <ContextMenu x:Key="myContextMenu">
            <MenuItem Header="Header Text" Click="MenuItem_Click"/>
        </ContextMenu>
    </DataGrid.Resources>
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="ContextMenu" Value="{StaticResource myContextMenu}"/>
        </Style>
    </DataGrid.ColumnHeaderStyle>
    <DataGrid.Columns>
        <DataGridTextColumn Header="c1" Binding="{Binding C1}" />
        <DataGridTextColumn Header="c2" Binding="{Binding C2}" />
        <DataGridTextColumn Header="c3" Binding="{Binding C2}" />
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)