Wpf-无法将MenuItem转换为Listbox?

时间:2010-12-19 21:59:06

标签: wpf exception xaml

我得到一个非常奇怪的例外。 我得到了例外:

"'Set connectionId threw an exception.' Line number '26' and line position '34'."

当我看到内部异常时,我得到了:

"Unable to cast object of type 'System.Windows.Controls.MenuItem' to type 'System.Windows.Controls.ListBox'."

我已将此异常的原因缩小到此MenuItem中包含的TreeViewItem样式中的TreeView

<TreeView x:Name="ProjectElementTreeView" ItemsSource="{Binding ProjectElementCollection}"  DisplayMemberPath="Name" Padding="0" SelectedItemChanged="ProjectElementTreeView_SelectedItemChanged" GotKeyboardFocus="ProjectElementTreeView_GotKeyboardFocus">
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HorizontalAlignment" Value="Left" />
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Name="AddProjectElementMenuItem" Header="Add" Click="AddProjectElementMenuItem_Click"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>
    </TreeView>

仅当MenuItem具有单击事件处理程序时才会发生异常,即使单击事件处理程序不包含任何代码也会抛出异常。

5 个答案:

答案 0 :(得分:15)

我和你一样有异常。在仔细查看代码之后,这感觉就像是你会得到的情况

  

“无法指定事件'点击'   在样式中的目标标签上。用一个   相反,EventSetter。“

我不确定为什么这不适用于此。
无论如何,使用EventSetter工作

<Setter Property="ContextMenu">
    <Setter.Value>
        <ContextMenu>
            <MenuItem Name="AddProjectElementMenuItem" Header="Add">
                <MenuItem.Style>
                    <Style TargetType="MenuItem">
                        <EventSetter Event="Click" Handler="AddProjectElementMenuItem_Click"/>
                    </Style>
                </MenuItem.Style>
            </MenuItem>
        </ContextMenu>
    </Setter.Value>
</Setter>

答案 1 :(得分:2)

我自己不得不面对这种奇怪的情况。 有一种简单的方法来克服它,你必须清理和重建项目,异常将消失。


希望这会有所帮助。

答案 2 :(得分:0)

我已经复制了你的代码,它对我有用。您确定发布的代码是否会导致问题?

不是将MenuItem放在ContextMenu的内容中,而是将其嵌入ContextMenu.Items:

<ListBox.ContextMenu>
    <ContextMenu>
        <ContextMenu.Items>
            <MenuItem Name="AddProjectElementMenuItem"></MenuItem>
        </ContextMenu.Items>
    </ContextMenu>
</ListBox.ContextMenu>a

答案 3 :(得分:0)

我遇到了这个错误并发现我将标记放在<MyApp:AppPage.Resources></MyApp:AppPage.Resources>之外,我的意思是我知道它必须在其中但我没注意到在我的上下文菜单标记之前已经调用了结束标记。我以为我还在里面。我只是在结束标记之前移动它,它按预期工作。

答案 4 :(得分:0)

我认为

Fredrik's answer解释了实际上是什么原因造成的。但这是另一种解决方案。

您还可以通过将ContextMenu声明为Style之外的单独资源来解决此问题:

<TreeView x:Name="ProjectElementTreeView" ItemsSource="{Binding ProjectElementCollection}"  DisplayMemberPath="Name" Padding="0" SelectedItemChanged="ProjectElementTreeView_SelectedItemChanged" GotKeyboardFocus="ProjectElementTreeView_GotKeyboardFocus">
    <TreeView.Resources>
        <ContextMenu x:Key="Menu">
            <MenuItem Name="AddProjectElementMenuItem" Header="Add"
                      Click="AddProjectElementMenuItem_Click"/>
        </ContextMenu>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Setter Property="ContextMenu" Value="{StaticResource Menu}" />
        </Style>
    </TreeView.Resources>
</TreeView>