SOFとGoogleのいたるところに同じようなタイトルの投稿が複数あることは知っていますが、しばらくお待ちください。
この記事に従って、グリッドビューのコンテキストメニューを作成しています:http ://www.koaxkoaxkoax.com/ribbit/2010/09/creating-dynamic-menus-in-wpf.html
でHierarchicalDataTemplateを作成しUserControl.Resources
ます。グリッドビューのリソースに空のメニューがあり、実際のコンテキストメニューで参照します。XAML(グリッドビューの最初の部分)は次のようになります。
<DataGrid.Resources>
<Views:ViewMenuItemCollection x:Key="Menu">
<Views:ViewMenuItem Text="foo"/>
<Views:ViewMenuItem Text="bar"/>
</Views:ViewMenuItemCollection>
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu ItemsSource="{DynamicResource Menu}"/>
</DataGrid.ContextMenu>
背後にあるコードではFindResource
、メニューへの参照を取得し、およびとViewMenuItem
同じレベルにある1つのオブジェクトを作成するために使用します。次に、リストを反復処理し、リストアイテムごとに1つのオブジェクトを作成し、それらを子オブジェクトとしてアタッチします。それは私がそれを持ちたいのと同じように見えます。しかし、実際の機能を動作させることはできません。foo
bar
ViewMenuItem
foreachループの内部(子オブジェクトを作成する場所)は次のようになります。
ViewMenuItem seriesItem = new ViewMenuItem();
seriesItem.Text = series.ForcedName;
seriesItem.Command = new RelayCommand<Series>(p=>_view.SetSeriesExecute(p));
_setSeriesMenuItem.Children.Add(seriesItem);
特に含む行p=>_view.SetSeriesExecute(p)
は私を混乱させます。私はそれとまったく同じように見える多くの例を見つけました。プログラムを実行して子要素の1つをクリックすると、SetSeriesExecute
メソッドは適切に呼び出されますが、パラメーターは常にnullです。それほど驚くことではありません。なぜなら、実際には、型のオブジェクトをSeries
パラメーターとして提供することはないからです。私は次のようにRelayCommandコンストラクターでパラメーターを提供しようとしました:p=>_view.SetSeriesExecute(mySeriesObject)
。コンパイルされますが、SetSeriesExecute
呼び出されることはありません。
私の目標は非常に単純です(少なくともそうだと思います):プログラムがコンテキストメニューの要素のクリックに反応するとき、メソッド(SetSeriesExecute
)は、ユーザーが実際に選択(=クリック)した項目を知る必要があります。残念ながらSetSeriesExecute
、4時間の真剣な調査にもかかわらず、パラメータをどこにどのように提供できるかを理解できませんでした。そして、他の誰もが利用可能な例を理解しているように見えるという事実は、私が自分自身について特に気分が良くなるわけではなく、すべてのヒントに生涯の感謝を捧げます。
最高のピーター