2

我知道 SOF 和 Google 上都有多个标题相似的帖子,但请耐心等待我一分钟。

我正在关注这篇文章为我的网格视图创建一个上下文菜单:http ://www.koaxkoaxkoax.com/ribbit/2010/09/creating-dynamic-menus-in-wpf.html

我在中创建 HierarchicalDataTemplate UserControl.Resources,我在 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处于同一级别的对象。然后我遍历一个列表并为每个列表项创建一个 -object 并将它们附加为子对象。这看起来就像我想要的那样。但我无法让实际功能正常工作。foobarViewMenuItem

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未被调用。

我的目标很简单(至少我认为是这样):当程序对单击上下文菜单中的元素做出反应时,方法 ( SetSeriesExecute) 需要知道用户实际选择(=单击)了哪个项目. SetSeriesExecute不幸的是,尽管进行了 4 小时的认真研究,但我无法弄清楚我可以在哪里以及如何向. 其他人似乎都理解了可用的例子这一事实并没有让我对自己感觉特别好,我对每一个提示都表示终生感激。

最好的彼得

4

1 回答 1

1

你缺少的是CommandParameter.

尝试设置seriesItem.CommandParameter为您想传递给该SetSeriesExecute方法的任何内容。 pinp=>_view.SetSeriesExecute(mySeriesObject)将是那个参数。

于 2013-02-20T17:59:33.603 回答