2010-02-12 62 views
4

我通常在圖形用戶界面上工作,我想通過禁用表單上的控件直接阻止用戶執行他們不應該做的事情。例如,也許我不希望啓用「Process Widgets」按鈕,除非用戶當前在應用程序中打開了「Widget Project」?或者只有在Widget處理運行時纔會啓用「取消處理」按鈕。我使用什麼設計模式將對象模型狀態的變化同步到GUI的狀態?

是否有一種常用的設計模式來同步對象模型中的狀態變化與GUI的狀態?

回答

1

聽起來像你正在尋找訂閱某些事件的能力。我會說使用觀察者模式。狀態模式在這種情況下有點過分殺死[如果它大於二進制條件,那麼你可以適應狀態模式來爲它工作]

0

我不是專家,但最近我一直閱讀關於WPF的Model-View-ViewModel模式,WPF基本上是一個利用WPF特性的MVC模式。由於您使用的是Winforms,因此您可以嘗試Model-View-Presenter模式。 There's an article here about it

如果你可以切換到WPF(雖然我覺得winforms有類似的東西),但它聽起來像你一定要使用命令功能。它有一些你想要內置的功能。基本上任何按鈕或任何訂閱命令,並有一個邏輯部分,確定是否啓用或禁用命令。你只需要檢查你的模型的狀態。

1

MVC和命令模式應該在這裏工作。基本的想法是,你需要發送一個'消息'(可能是一個對象或字符串或任何真正的東西)到GUI來通知它改變它的狀態和方式。您必須小心考慮GUI接收和處理消息時可能發生的任何延遲。

您可以創建一個事件隊列(與命令關聯),並確保第一個輸入是第一個輸出(因此排隊)。然後讓GUI處理隊列中的下一個事件,這將確保在您觸發另一個事件來完成剛剛嘗試禁用的事件之前更新GUI。然後,您可以報告錯誤或忽略它或其他。無論如何,一旦收到禁用該功能的命令,用戶將無法執行某些操作。 GUI按鈕的禁用只是一種視覺效果,應該有後臺中的命令的預防代碼,這些代碼真的可以爲您做好工作。

0

這不適用於winforms,但Qt最近引入了一個狀態機框架來緩解基於應用程序的內部狀態改變UI元素的狀態。有關更多信息,請參閱Qt documentation

這個想法可能也適用於基於winforms的應用程序。儘管這可能需要相當大的初始努力。我不知道任何現有的實現。