2017-01-30 13 views
0

私の単純なWPFアプリケーションでは、動的な方法でグリッドのコンテキストメニューを使用します:私は将来、それを展開する場合には列挙から項目を取得します。私は、ユーザーがクリックするメニュー項目に基づいて異なるアクションを実行したいですが、どのアイテムがクリックされたかに関係なく、同じイベントを発生させることができます。ここでWPF:列挙型のコンテキストメニューにイベントを添付するにはどうすればいいですか?

は、XAMLコードです:

<Window 
x:Class="ProcessViewer.MainWindow" 
Title="Process Viewer" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:local="clr-namespace:ProcessViewer" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
Height="350" 
Width="525" 
WindowStartupLocation="Manual" 
mc:Ignorable="d"> 

<Window.Resources> 
    <ObjectDataProvider 
     x:Key="contextToEnum" 
     MethodName="GetValues" 
     ObjectType="{x:Type sys:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:ProcessType" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider>  
</Window.Resources> 

<Grid 
    x:Name="grid" 
    Background="Transparent"> 
    <Grid.ContextMenu> 
     <ContextMenu 
      Name="menu"     
      MenuItem.Click="MenuButton_Click" 
      ItemsSource="{Binding 
       Source={StaticResource contextToEnum}}"> 
     </ContextMenu> 
    </Grid.ContextMenu> 
</Grid> 

私はコンテキストメニューにクリックイベントを添付して、コンテキストメニューにそのオブジェクト引数をキャストしようとしたが、私は名前だけにアクセスすることができますここで、コンテキストメニュー(そのアイテムのないもの)と等幅と高さのような他の特性

では、コードビハインドのrelelvant一部である:

private void MenuButton_Click(object sender, RoutedEventArgs e) 
    { 

     ContextMenu choice = sender as ContextMenu; 
     MessageBox.Show("You clicked: " + choice.Name.ToString()); 

    } 

個別のイベントを添付する方法はありますかまたは各アイテムには?私がするので

if(clikedOnItem == enum.OneOfTheItems) 
    { 
     DoSomething() 
    } 
else if (clikedOnItem == enum.Anotheritem) 
    { 
     DoSomethingElse() 
    } 

など

:問題は、もちろん、多くの項目が列挙ホールドは、理想的なソリューションは、このようなものになるだろうされますので、どのように私は事前に知っていないということでしょう最大5-15の列挙型要素で作業すると、手動ですべてのメニュー項目を実行できますが、可能であれば、より知的な回避策を探したいと思います。

<ContextMenu 
      Name="menu"     
      ItemsSource="{Binding Source={StaticResource contextToEnum}}"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <EventSetter Event="Click" Handler="MenuButton_Click" /> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 

...そしてMenuItemに送信者の引数をキャストし、DataContextの通過列挙値にアクセス:

答えて

2

あなたはEventTriggerでItemContainerStyleを使用して、各のMenuItemのClickイベントを処理することができるはずですMenuItemのプロパティ:

private void MenuButton_Click(object sender, RoutedEventArgs e) 
{ 
    MenuItem choice = sender as MenuItem; 
    ProcessType val = (ProcessType)choice.DataContext; 
} 
関連する問題