WPF:如果我将一个eventhandler添加到MenuItem(在ListBox中)的例外

时间:2010-12-30 02:50:48

标签: wpf exception listbox contextmenu

我想要一个用于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>

这很有效。我有所有项目的contextmenu,但是如果我想在menuitem中添加click-eventhandler,就像这样:

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

创建窗口时出现XamlParseException。

的InnerException: Object System.Windows.Controls.MenuItem无法转换为System.Windows.Controls.Grid类型

如果我添加一个事件处理程序,它只抛出异常。事件方法是空的。

编辑: InnerException的Stacktrace:

  

在   Chat_Client.ChatWindow.System.Windows.Markup.IComponentConnector.Connect(的Int32   connectionId,Object target)in   C:\ XXX \ Chat_Client \ ChatWindow.xaml:行   19。

     

在   MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetConnectionId(对象   root,Int32 connectionId,Object   实例)

EDIT2: 现在我必须得到我用contextmenu点击的对象。首先我试过这个:

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

但是Popup的父级是null。 然后我只是从ListBox中获取selectedItem。这有效,但是没有办法获得所点击的Contextmenu的ListBoxRow吗?

1 个答案:

答案 0 :(得分:4)

我无法使用VS2010和WPF4重现您的崩溃。

您只需要为所有项目设置一个上下文菜单,以便将其提取到窗口资源,例如:

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

然后更改您的setter以引用该上下文菜单:

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

然后事件处理程序工作:

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