MenuItem_Click 'недействительно.«Клик» не является событием для System.Windows.Controls.DataGridTextColumn - PullRequest
2 голосов
/ 08 марта 2012

Когда я пытаюсь скомпилировать следующий код 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>

Обработчик Click определяется в MenuItem, а не в DataGridTextColumn.Почему этот обработчик Click нарушает DataGrid?

1 Ответ

7 голосов
/ 08 марта 2012

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>
...