2012-05-20 58 views
0

我有以下幾點:通過依賴屬性啓用暫時禁用按鈕

<Button Content="Do XXX" Height="23" Name="btnXXX" 
        IsEnabled="{Binding Path=(Model:INameOfInterface.CanDoXXX)}" /> 
    <Button Content="Do YYY" Height="23" Name="btnYYY" 
        IsEnabled="{Binding Path=(Model:INameOfInterface.CanDoYYY)}" /> 

工作非常漂亮,btnXXX根據接口是否能爲YYY做XXX,btnYYY類似啓用或禁用。

但是,要強制每次點擊一個動作,我希望在點擊其中一個按鈕時禁用所有按鈕,即暫時覆蓋依賴關係並禁用按鈕,然後一旦執行動作,就重新建立依賴關係條件。

所以我的問題是:如何暫時禁用所有按鈕,然後繼續依賴

+0

您的意思是行動完成後立即重新啓用按鈕嗎? – pbalaga

+0

是的,但根據屬性。當然,我可以手動禁用所有,然後爲每個按鈕做:btnYYY.enabled = INameOfTheInterface.CanDoYYY,但這將打敗整個依賴屬性的目的,即它應該沒有編碼... – Avi

+0

您可以創建bool屬性並將其與所有按鈕IsEnable綁定。每當你做了一些動作,使它成爲假的,並在完成動作後使其成爲真,這反過來將影響所有的按鈕。 –

回答

1

通常,您不會「覆蓋並恢復依賴項屬性」,但會設計Model/ViewModel,以便您綁定的屬性封裝所有必需的狀態。在你的情況下,這意味着你的Model:INameOfInterface.CanDoXXX應該是真實的,並且當任何按鈕動作正在執行(xxx,yyy,...)時都是假的。所以你的CanDoXXX必須知道YYY的執行情況。將所有模型混合在一起可能不是個好主意,而這正是ViewModel發揮作用的地方。

假設您的Model實例只能自我感知:CanDoXXX爲假只有如果XXX正在執行。您可以使ViewModel類包含一組模型,每個模型都有其各自的狀態。現在,您只需要將屬性放入VM中,例如CanExecuteAny這將遍歷所有模型,並檢查他們中的任何人是否正在工作(CanDoXXX,CanDoYYY表明)。最後綁定

<Button IsEnabled={Binding CanExecuteAny} /> 

這只是潛在的解決方案之一,最好的取決於數據的確切結構。這裏有一些其他的想法:

  • 你可以把你所有的按鈕放在面板和禁用面板,而不是單獨的按鈕。
  • 執行ICommand界面並綁定按鈕的Command屬性。見RelayCommand的概念。我個人喜歡它。因爲你的按鈕需要信息是否有任何其他按鈕被點擊過,所以你可能會發現有一種全局狀態可以被所有模型訪問(完全依賴注入;沒有DI的完美的單例)是很有用的。

說了這麼多,其基本思想是對你有可以綁定到一個單一的財產所有需要的信息。交換DP並不是真正的設計工作方式。 Binding已經有更新的東西,所以多次設置它會重複執行兩次相同的作業。

1

您可以創建布爾屬性,並綁定所有按鈕IsEnable它。每當你做了一些動作,使它成爲假的,並在完成動作後使其成爲真,這反過來將影響所有的按鈕。或者你可以使用微調/忙指標。

+0

對不起,我不明白你的答案:( 考慮btnXXX。我希望它依賴於CanDoXXX屬性 - 當屬性爲true時,該按鈕應該啓用。當屬性爲false時,該按鈕應該被禁用。這很簡單,但是我只是想在點擊任何按鈕之後,直到點擊事件處理程序返回,所有按鈕都應該被​​禁用。 – Avi