2013-02-20 93 views
2

我知道在SOF和Google中有多個帖子有類似的標題,但請耐心等待一分鐘。將參數傳遞給代碼後面的RelayCommand

我下面這篇文章,創建我的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 -object是在同一水平foobar 。然後我遍歷一個列表併爲每個列表項目創建一個ViewMenuItem -object並將它們作爲子對象附加。這看起來就像我想要的一樣。但我無法獲得實際的功能。

在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)需要知道哪個項目實際上已被選中(=已點擊在)由用戶。不幸的是,儘管經過了4個小時的嚴肅研究,我仍無法弄清楚在哪裏以及如何向SetSeriesExecute提供參數。事實上,其他人似乎都瞭解可用的例子並不會讓我感到自己特別好,並且我對每一個提示都表示終生感激。

最佳 彼得

回答

1

你錯過了什麼是CommandParameter

嘗試將設置爲seriesItem.CommandParameter以任何你想傳遞給SetSeriesExecute方法。 pp=>_view.SetSeriesExecute(mySeriesObject)將是該參數。

+0

+1,或者對'CommandParameter'應用綁定。事實上,兩者都應該受到約束。 – user7116 2013-02-20 18:03:15

+0

我已將'Series CommandParameter'添加到我的'ViewMenuItem'類中。但是'SetSeriesExecute'中的參數仍然爲空。無論如何,SetSeriesExecute如何知道該屬性? – Peter 2013-02-20 18:05:58

+0

什麼是'series.ForcedName'? – Khan 2013-02-20 18:18:03