我知道在SOF和Google上有多个帖子都有相似的标题,但请耐心等一下。
我正在关注本文,为我的gridview创建一个上下文菜单:http://www.koaxkoaxkoax.com/ribbit/2010/09/creating-dynamic-menus-in-wpf.html
我在UserControl.Resources
中创建了HierarchicalDataTemplate,我在gridview的资源中有一个空菜单,然后我在实际的上下文菜单中引用它。 XAML(gridview的第一部分)如下所示:
<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
- 与foo
和bar
处于同一级别的对象。然后我遍历一个列表并为每个列表项创建一个ViewMenuItem
- 对象并将它们作为子对象附加。这看起来就像我想拥有它一样。但我无法获得实际的功能。
foreach-loop的内部(我创建子对象的地方)看起来像这样:
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)
的行让我感到困惑。我发现很多很像的例子。当我运行我的程序并单击其中一个子元素时,SetSeriesExecute
方法被正确调用 - 但参数始终为null。这并不太令人惊讶,因为我实际上并没有提供Series
类型的对象作为参数。我试图在RelayCommand构造函数中提供如下参数:p=>_view.SetSeriesExecute(mySeriesObject)
。它编译,但SetSeriesExecute
永远不会被调用。
我的目标非常简单(至少我认为是这样):当程序对上下文菜单中的元素点击作出反应时,方法(SetSeriesExecute
)需要知道实际选择了哪个项目(=点击)用户。不幸的是,尽管进行了4个小时的严肃研究,我还是无法弄清楚我可以向SetSeriesExecute
提供参数的位置和方式。事实上,其他人似乎都了解可用的例子并不能让我对自己感觉特别好,我会对每一个提示终身感激。
彼得
答案 0 :(得分:1)
您遗失的是CommandParameter
。
尝试将seriesItem.CommandParameter
设置为您希望传递给SetSeriesExecute
方法的任何内容。 p
中的p=>_view.SetSeriesExecute(mySeriesObject)
将成为该参数。