【WPF】ContextMenuに表示される一部項目を、場合に応じて選択できなくする

意外と書いてあるサイトが少なかったのでメモしておきます。 WPFで、通常右クリック時に開かれるメニューに用いられるContextMenuコントロールの内容を、 開かれる前に編集したいことがあると思いますが、 そのときはContextMenuOpeningイベントを利用すると良いみたいです。 自分はListVIewを右クリックしたときに表示されるメニューのうち、アイテムが複数選択されているときのみ有効な項目を作りたかったので、以下のようにしました。

    public partial class Window1 : Window
    {
        ContextMenu contextMenu = new ContextMenu();

        MenuItem menuItem0 = new MenuItem();
        MenuItem menuItem1 = new MenuItem();

        public Window1 ()
        {
            InitializeComponent();
            CreateMenu();
        }

        private void CreateMenu()
        {
            menuItem0.Header = "選択項目をマージ";
            menuItem0.Click += menuItem_ClickMergeItems;
            menuItem1.Header = "選択項目を削除";
            menuItem1.Click += menuitem_ClickDelete;

            contextMenu.Items.Add(menuItem1);
            contextMenu.Items.Add(menuItem2);

            //コンテキストメニュー表示時に発生するイベントを追加
            listVIew.ContextMenuOpening += contextMenu_Click;

            //ListViewコントロール
            listVIew.ContextMenu = contextMenu;
        }

        private void contextMenu_Click(object sender, RoutedEventArgs e)
        {
            //listviewのアイテムが複数選択されていない場合、一部項目を無効にする
            menuItem0.IsEnabled =  listVIew.SelectedItems.Count > 1;
        }
    }

大事なのはContextMenuの親元のコントロールにイベントを追加することです。 最初

contextMenu.ContextMenuOpening += contextMenu_Click;

としていたのですが、こうするとContextMenuが開かれているときに右クリックした場合しか呼ばれなくなります。

stackoverflow.com