2010-06-03 82 views
1

我有一個WPF應用程序,他們的菜單正在使用命令功能。一切都很好,當我點擊菜單中的按鈕時,命令就會運行。但是,我無法獲得按鈕的IsEnabled狀態來尊重我的命令的CanExecute部分。從WPF中的命令訪問控件

一個挑戰是需要查看你在UI中做什麼的命令。例如,一個命令應該只在ListBox中的某些項被選中時纔可用,因此我需要獲得對ListBox的引用......但是由於該命令在我的視圖模型(MVVM模式)中公開,所以它沒有訪問UI(順便說一下,菜單在一個用戶控件[parent = mainwindow]中,而ListBox在另一個用戶控件[parent = mainwindow]中)。

此外,即使我硬編碼命令的CanExecute方法返回false,該按鈕的Enabled屬性不會更改...該命令不會觸發,但它不會更改...令人沮喪。我想我需要修改/提高CanExecuteChanged事件,但我不知道什麼時候應該這樣做(找不到一個好的示例)。

反饋?

回答

2

嘗試從MVVMLight的信使類。它有助於ViewModels之間的通信。

這給一試:

有你的ListBox的一個視圖模型SelectedItem屬性。在屬性更改時廣播消息。在菜單的ViewModel中註冊此消息。爲您的邏輯使用CanExecute方法中的SelectedItem屬性。

+0

檢出MVVMLight ...我喜歡Messger類的想法...謝謝! – 2010-06-15 15:43:35

2

通常情況下,您可以綁定MenuItem/Button的Command屬性 - 無論如何,這意味着您仍然可以使用CommandParameter - 然後可以綁定到其他控件。然而,當這兩個視圖不知道彼此的時候,你需要它們之間的som類型的中介(即兩個視圖都可以訪問的視圖模型 - 將列表框SelectedItem/SelectedItems綁定到屬性雙向 - 並讓CommandParameter單向綁定到相同的屬性)。

至於何時觸發CanExecuteChanged事件 - 只要CanExecute-method中包含的邏輯發生更改,就應該觸發該事件。如果它始終爲false,則不應該觸發該事件,因爲它將在設置Command參數時讀取初始值。 '

如果您的按鈕行爲異常 - 請檢查IsEnabled屬性是否受樣式影響或直接設置。

希望這會有所幫助。