2010-04-30 124 views
3

我對WPF相當陌生,並且在場景中掙扎一點。我有一個有菜單項的菜單。當這些菜單項中的一個被點擊時,需要調用一個方法,該方法將根據與該菜單項相關聯的文本執行某些操作。因此,例如,菜單項的內容是「測試」,所以我需要做一些「測試」。僅供參考,這個「東西」直接影響ViewModel上的一個集合。WPF MenuItem ViewModel命令

這很容易實現使用click事件和沒有ViewModel,但我試圖實現MVVM使用明確的ViewModel。所以我開始研究命令,但看不到我將View中的任何東西傳回ViewModel中的命令。

關於我應該在這裏做什麼的任何建議?

感謝

回答

5

既然你有一個項目驅動指揮我會建議使用像這樣的類似威爾的第二個建議的東西的集合:

<MenuItem 
    Command="{Binding MenuCommand}" 
    CommandParameter="{Binding}" 
    Header="{Binding DisplayText}" /> 

在視圖模型方面,你可以使用一個DelegateCommand或RelayCommand掛鉤的處理器方法。這使您可以檢查菜單項的數據,並根據其中的內容做所需的任何操作。

public DelegateCommand<MyMenuObject> MenuCommand { get; private set; } 

public ViewModel() 
{ 
    MenuCommand = new DelegateCommand<MyMenuObject>(MenuCommandExecuted); 
} 

public void MenuCommandExecuted(MyMenuObject parameter) 
{ 
    // do something based on the parameter object 
} 

您還需要爲pass MenuCommand到您的收藏項目一個ICommand屬性使用簡單的綁定形式上方或更改命令結合使用的東西像的RelativeSource FindAncestor樹仰望父用於MenuCommand的DataContext(ViewModel)。使用此方法可以靈活地添加或刪除集合中的項目,而無需進行任何UI更改以支持新的項目集合。

Prism DelegateCommand

RelayCommand

2

你有兩個選擇。

  1. 揭露一個ICommand每個菜單命令,如 「FileCommand」, 「EditCommand」, 「SaveCommand」 等
  2. 使用CommandParameter將信息發送回命令,如

<菜單項命令= 「{結合MenuCommand}」 CommandParameter = 「文件」>文件< /菜單項>

我覺得第一個選項是更好,因爲它避免了神奇的字符串。

+0

OK,感謝您的答覆。我忘了提到菜單項顯示的文本被綁定到ViewModel,也就是ObervableCollection。這當然會排除2號。 我不知道我完全理解No.1嗎?我創建了一個實現ICommand接口的命令,但是包含的文本是如何傳遞給命令的呢? 再次感謝 – 2010-04-30 13:03:12

+0

@jon我假設接受的答案向你清楚。 – Will 2010-05-01 14:40:04