Clickイベントを持つContextMenuを持つTreeViewがあります。コンテキストメニューのクリックイベントが発生すると、明らかにイベントのソースとしてMenuItemが取得されます。 ContextMenuをトリガーしたノードは、TreeViewのどのノードを取得するのですか?WPFでContextMenu起点イベントのソースを取得するにはどうすればよいですか?
答えて
一般に、ContextMenuの「ポップアップ」イベントのプライベートクラスレベルの変数で、TreeViewノード(ポップアップイベントのソース、選択されたノードなど - あなたのインターフェイスにある程度依存します)を保存しますメニューのクリックイベントでその変数を参照します。あなたがRoutedUICommands
を使用している場合
また、あなたはCommand
はそのバブルを始めFrameworkElement
を見つけることExecuteRoutedEventArgs
とCanExecuteRoutedEventArgs
にOriginalSource
プロパティを使用することができます。
しかし、OriginalSource
は内部のTextBlockやノードのDataTemplateの他の要素かもしれないので、VisualTreeHelperを使用して必要な親を探す必要があります。私は、次のようなこの機能をラッパーとして実装しました。 http://www.hardcodet.net/2008/02/find-wpf-parent/
大規模なアプリケーションでコマンドロジックを分離/集中する場合は、この方法が適しています。
私は、データバインディングですべての方法を行っているときに、OriginalSourceのDataContextプロパティを使用して非常に幸運を覚えました。 OriginalSourceは常にFrameworkElementでなければなりません。 –
私の問題は今解決されていますが、あなたの解決策はかなり良いようです。私は数日後にそれをチェックします。ありがとうございました。 – sker
//このより良い方法があるはずです... TreeViewItem tvi =((送信者としてMenuItem).ParentをContextMenuとして使用).Parent as Popup).PlacementTarget as TreeViewItem;
これは機能しますが、なぜ私はこのようにしてはいけませんか?
これは良い考えです。ポップアップイベントがContextMenuOpeningかどうか知っていますか?なぜなら、メニューを開くとContextMenuOpeningもContextMenuClosingも起動しないからです。 – sker
Openedイベントである必要があります。 http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.opened.aspx – dommer
私はtelerikのツリービューを使用していますが、Openedイベントはありませんが、 MouseRightButtonUpイベントで行います。ありがとうございました。 – sker