2011-05-05 59 views
3

這個問題和聽起來一樣簡單。假設button.IsEnabled == false,當我執行button.IsEnabled = true;該按鈕仍然是假的! (通過使用Visual Studio'watch'功能在調試器中設置它之後立即查看該值)不能在C#中設置button.IsEnabled = true WPF

顯然,這種情況並不像通常的代碼那樣常見。但是系統中顯然存在一些阻礙設置的東西,我正在尋找關於它可能的想法。起初我以爲是因爲這個按鈕被掛在了一個ICommand中,顯然它控制着IsEnabled設置本身。所以我取消了ICommand。這適用於不同的按鈕,但此按鈕沒有通過「命令= {綁定路徑...}」掛接到ICommand。其實這個按鈕在C#創建爲簡單:在自定義的控件工具欄存在

Button button = new Button(); 
button.Content = "Save Record"; 
button.IsTabStop = false; 

這些按鈕和發生在的PropertyChanged事件處理程序我寫這是試圖建立自己的價值的代碼。奇怪的是,相同的代碼最初成功地將按鈕設置爲false,並且工作正常!什麼可能會禁止設置IsEnabled = true?

幾個小時後:

呸,新手的錯誤(35年後,在IT)。進一步在代碼中的行是:

button.Command = new myCommand(...); 

所以,事實上,按鈕是通過命令接口掛鉤。我把它拿出來,並用按鈕單擊事件處理程序替換它,問題就解決了。由於我無法在Google中找到此問題,所以經過無數次搜索後,讓我重申問題以防其他人遇到問題:當您將ICommand與UIElement掛鉤時,例如,按鈕,menuitem等.Net接管IsEnabled屬性。您不能再以編程方式設置屬性。

回答

2

我知道你已經回答了這個問題,但是看起來你只是掏出了新風格的代碼,並回到了舊的方式。因此,如果你想知道新方法如何運作,請繼續閱讀。

命令是事件系統的改進!命令替換IsEnabled屬性和Click事件,並讓您爲該命令定義有用的快捷方式。

一旦你將某些東西掛鉤到一個Command中,你不應該再使用IsEnabled或Click來做那件事。

與「IsEnabled = True」等效的命令是從Command的CanExecute事件處理程序返回True。

然後,爲命令定義一個Executed處理程序,並替換Click事件。

這是爲什麼這麼好?簡單:您可以將一個工具欄按鈕,一個菜單項,一個上下文菜單項以及其他一些接口部件連接到Command上,並且不必跟蹤(或定義)每個這些元素的屬性或事件。想想一個文本編輯器應用程序。傳統的方法是將事件連接到編輯>複製,複製工具欄按鈕和上下文菜單項;處理TextBox的SelectionChanged事件以根據需要啓用/禁用所有這些事件;併爲每個人編寫Click事件。新方法是:將命令掛鉤到編輯>複製,複製工具欄按鈕和上下文菜單項,根據TextBox的選擇屬性定義CanExecute事件以返回true/false,並對Executed處理程序進行編碼。看起來類似?是的,但是你用標記而不是代碼來聲明命令連接,而且你不必編寫幾乎沒有的代碼。當你有很多命令時,它可以節省很多錢。

相關問題