我知道 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 循环的内部部分(我创建子对象的地方)如下所示:
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
方法被正确调用 - 但参数始终为空。不足为奇,因为我实际上从未提供过 Series
类型的对象作为参数。我试过像这样在 RelayCommand 构造函数中提供参数:p=>_view.SetSeriesExecute(mySeriesObject)
.它编译,但是 SetSeriesExecute
永远不会被调用。
我的目标非常简单(至少我是这么认为的):当程序对上下文菜单中的元素单击使用react时,方法 ( SetSeriesExecute
) 需要知道实际选择了哪个项目 (=用户点击)。不幸的是,我无法弄清楚在哪里以及如何向 SetSeriesExecute
提供参数。 ,尽管进行了 4 小时的认真研究。事实上,其他人似乎都理解可用的示例并没有让我对自己感觉特别好,我对每一个提示都表示终生感激。
最佳 彼得
最佳答案
您缺少的是 CommandParameter
。
尝试将 seriesItem.CommandParameter
设置为您想要传递给 SetSeriesExecute
方法的任何内容。 p=>_view.SetSeriesExecute(mySeriesObject)
中的 p
将是该参数。
关于c# - 在代码隐藏中将参数传递给 RelayCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14986561/