在后面的代码中将参数传递给RelayCommand

时间:2013-02-20 17:49:11

标签: c# wpf mvvm relaycommand

我知道在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 - 与foobar处于同一级别的对象。然后我遍历一个列表并为每个列表项创建一个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提供参数的位置和方式。事实上,其他人似乎都了解可用的例子并不能让我对自己感觉特别好,我会对每一个提示终身感激。

最佳

彼得

1 个答案:

答案 0 :(得分:1)

您遗失的是CommandParameter

尝试将seriesItem.CommandParameter设置为您希望传递给SetSeriesExecute方法的任何内容。 p中的p=>_view.SetSeriesExecute(mySeriesObject)将成为该参数。