2010-12-30 17 views
3

ListBoxItemのコンテキストメニューが必要でした。 私はこれを作成しました:WPF:(ListBoxの)MenuItemにイベントハンドラを追加すると例外が発生する

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

これは素晴らしいです。私はすべての項目のコンテキストメニューがありますが、私はこのように、メニュー項目にクリックイベントハンドラを追加したい場合:

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

をウィンドウが作成されたとき、私はXamlParseExceptionを取得します。

のInnerException:オブジェクトSystem.Windows.Controls.MenuItemがSystem.Windows.Controls.Grid

型に変換することができません 私は、イベントハンドラを追加する場合には、唯一の例外がスローされます。イベントメソッドは空です。

編集:のInnerExceptionの スタックトレース:\ XXX \ Chat_Client \: CでChat_Client.ChatWindow.System.Windows.Markup.IComponentConnector.Connect(のInt32 connectionId、オブジェクト対象)における

ChatWindow.xaml: で行19

MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetConnectionId( インスタンスオブジェクト、 ルート、のInt32 connectionIdオブジェクト)

Edit2: ここで、コンテキストメニューでクリックしたオブジェクトを取得する必要があります。最初に私はこれを試した:

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

しかし、ポップアップの親はnullです。 次にListBoxからselectedItemを取得します。これは動作しますが、クリックされたコンテキストメニューのListBoxRowを取得する方法はありませんか?

+0

をのInnerExceptionのスタックトレースには何ですか? – SLaks

+0

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 connectionId、オブジェクトインスタンス) – user437899

答えて

4

私はVS2010とWPF4でクラッシュを再現できません。

ます。たとえば、ウィンドウのリソースにそれを抽出することができますので、あなたは唯一のすべてのアイテムに対して1つのコンテキストメニューを必要とする:

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

をして、その1つのコンテキストメニューを参照するために、あなたのセッターを変更します。

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

と、イベントハンドラは、その後作品:

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

リックありがとうございます。私はエラーを再現するために新しいデモプロジェクトを作成しましたが、今回は例外です...しかし、イベントは発生しませんでした。 (私はリストボックスで定義されたコンテキストメニューを持っていました)Windows.Ressourcesへのコンテキストメニューを抽出した後、それは機能しました!しかし、コンテキストメニューがリストボックスで定義されていると、なぜ機能しませんでしたか? – user437899

関連する問題