2010-12-19 9 views
5

Me aparece una excepción muy extraña. tengo la excepción:Wpf- ¿Imposible lanzar MenuItem a Listbox?

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

Cuando miro a la excepción interna consigo:

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

he estrechado la causa de la excepción a la MenuItem en el estilo TreeViewItem contenida en este 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> 

La excepción solo se produce cuando el MenuItem tiene un controlador de eventos de clic y se lanza incluso cuando el controlador de eventos click no contiene ningún código.

+0

guau, eso es * realmente * raro ... –

+0

El código publicado funcionó bien para mí, así que creo que su problema está en una pieza diferente de código. ¿Qué intenta establecer ConnectionId? – Rachel

Respuesta

15

que tiene la misma excepción como lo hizo. Después de mirar de cerca al código, esto se siente como una situación en la que se obtendría

"El evento 'clic' no se puede especificar en una etiqueta de destino en un estilo. Utilice un EventSetter en su lugar."

No estoy seguro de por qué eso no se aplica aquí.
De todos modos, el uso de un EventSetter funciona

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

He copiado tu código y funciona para mí. ¿Estás seguro de que el código que publicaste está causando el problema?

En lugar de colocar la Menultem en el contenido de ContextMenu, nido bajo ContextMenu.Items:

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

Todavía causa la excepción. Una vez más, la excepción solo ocurre cuando MenuItem tiene un evento click adjunto. – Justin

+0

Sí, lo probé con el controlador de eventos adjunto. No creo que haya nada de malo en la xaml que publicaste: debe ser un problema de máquina/configuración. –

+0

Qué versiones estás usando para probar esto. [Descargo de responsabilidad: Yo no probé esto solo, solo tratando de asegurarme de que estás comparando naranjas con naranjas.] –

2

que tenía que hacer frente a esta situación extraña a mí mismo. Hay una manera fácil de superarlo, debe limpiar y reconstruir el proyecto y la excepción desaparecerá.


Espero que esto ayude.

+0

Demonios, sí, pasé media hora. Esto fue trabajado para mí gracias –

+0

Tuve que ir más allá de esto y cerrar VS y eliminar los directorios 'obj' y' bin' en la carpeta del proyecto. – Brendan

+0

Nada de esto funcionó para mí, tuve que usar el generador de eventos. –

0

Me encontré con este error y descubrí que puse el etiquetado fuera de <MyApp:AppPage.Resources></MyApp:AppPage.Resources>, quiero decir que sé que tiene que estar dentro pero no noté que la etiqueta de cierre ya estaba llamada antes de la etiqueta del menú contextual. Pensé que todavía estaba dentro. Acabo de moverlo antes de la etiqueta de cierre y funcionó como se esperaba.

Cuestiones relacionadas