WPF: Исключение, если я добавляю обработчик событий в MenuItem (в ListBox) - PullRequest
3 голосов
/ 30 декабря 2010

Я хотел контекстное меню для моих ListBoxItems.Итак, я создал это:

<ListBox Name="listBoxName">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding UserName}" />
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                    <ListBox.ItemContainerStyle>
                        <Style TargetType="ListBoxItem">
                            <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu>
                                        <MenuItem Header="View" Name="MenuItemView" />
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ListBox.ItemContainerStyle>
                </ListBox>

Это прекрасно работает.У меня есть контекстное меню для всех элементов, но если я хочу добавить обработчик события click к элементу меню, например:

<MenuItem Header="View" Name="MenuItemView" Click="MenuItemView_Click" />

Я получаю исключение XamlParseException при создании окна.

InnerException: Объект System.Windows.Controls.MenuItem не может быть преобразован в тип System.Windows.Controls.Grid

. Он выдает только исключение, если я добавляю обработчик событий.Метод события пуст.

Редактировать: трассировка InnerException:

в Chat_Client.ChatWindow.System.Windows.Markup.IComponentConnector.Connect (Int32 connectionId, Object target)в c: \ XXX \ Chat_Client \ ChatWindow.xaml: строка 19.

в MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetConnectionId (корень объекта, идентификатор подключения Int32, экземпляр объекта)

Edit2: Теперь мне нужно получить объект, на который я нажал, в контекстном меню.Сначала я попробовал это:

//MenuItem s = sender as MenuItem;
//ContextMenu cm = s.Parent as ContextMenu;
//Popup pu = cm.Parent as Popup;
//object o = pu.Parent;

Но родитель всплывающего окна нулевой.Тогда я просто получаю selectedItem из ListBox.Это работает, но нет ли способа получить ListBoxRow из контекстного меню, по которому щелкнули?

1 Ответ

4 голосов
/ 30 декабря 2010

Я не могу воспроизвести ваш сбой с VS2010 и WPF4.

Вам нужно только одно контекстное меню для всех ваших элементов, чтобы вы могли извлечь его в ресурс окна, например:

<Window.Resources>
    <ContextMenu x:Key="ListBoxItemContextMenu">
        <MenuItem Header="View" Name="MenuItemView" Click="MenuItemView_Click"/>
    </ContextMenu>
</Window.Resources>

и затем измените ваш установщик, чтобы обратиться к этому одному контекстному меню:

<Setter Property="ContextMenu" Value="{StaticResource ListBoxItemContextMenu}"/>

и обработчик событий тогда работает:

private void MenuItemView_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("Clicked!");
}
...