2011-06-13 17 views
2

基本上我有以下情況:TextBox中的數據無效 - 如何禁用我的命令按鈕?

<TextBox Text="{Binding MyIntValue}" /> 
<Button prism:Click.Command={Binding MyCommand}" /> 
public Boolean CanDoCommand() 
{ 
    return (MyIntValue < 100); 
} 

public void DoCommand() { ... } 

所以這裏的問題,如果我在mycommand的變爲啓用的25的值類型。之後,如果我將其更改爲25A,則Button仍處於啓用狀態,因爲綁定未更新以反映ViewModel中的錯誤。相反,我的視圖只有一個綁定錯誤。這使得使mycommand的按鈕,並在25

我如何禁用按鈕MyIntValue還是基於具有任何約束性問題,即使我的視圖模型是正確的?

編輯(什麼海報是真正要求):

我怎麼能不管 什麼CanExecute方法從視圖模型基於具有綁定錯誤查看 返回 禁用按鈕?

+0

基本上,任何人不知道...的OP在問:'我怎樣才能禁用按鈕CanExecute是否返回真/假'也就是說,一些邏輯上的視圖層只屬於(答案應注意什麼?不涉及改變他的ViewModel)。 – 2011-06-14 14:55:30

回答

0
<Button prism:Click.Command={Binding MyCommand, 
    UpdateSourceTrigger=PropertyChanged}" /> 
+0

commandbinding是單向的,所以更新源觸發器是沒用的。問題是MyIntValue綁定不是命令綁定 – blindmeis 2011-06-13 15:47:45

+0

我同意@blindmeis,'UpdateSourceTrigger'屬於另一個綁定。 – user7116 2011-06-13 16:21:22

0

您必須提升命令的時候可以改變MyIntValue執行更改事件。

0

如果您MyIntValue財產的INT你的綁定,當你輸入25A將永遠不會更新類型。

解決這個ONY方法是在VM側使用串和IDataErrorInfo的類型。

另一種方法是使用typeof運算可空int和轉換器,當它不是你所期望的值設置爲null。

編輯:

如何禁用基於具有任何約束性問題,即使我的視圖模型是正確的按鈕?

你的問題是你的虛擬機和你的用戶界面不同步。如果你輸入25A,你的Vm似乎是正確的,因爲它仍然有25個,但你的視圖有一個BindingError。所以你的問題應該是我如何同步我的觀點和視圖模型。 (見我的兩個建議)

編輯: 另一個解決辦法是,以防止輸入錯誤。所以一個Masked或RegexTextbox行爲也應該起作用。

+0

如果您關注MVVM,強制ViewModel解決視圖上的可能錯誤並不好。你是VM,不應該把它的屬性改成String的,然後做一些黑客轉換回Int,只是爲了安撫ONE視圖。對不起,但你的解決方案是一個打破mvvm設計模式的工作解決方案。 相反,即使ViewModel將該命令的CanExecute提升爲true,用戶確實也需要一種方法來禁用該按鈕。 – 2011-06-14 14:51:17

+0

以及我不這麼認爲,虛擬機僅用於查看,虛擬機應該做我需要的視圖。該模型仍然具有int屬性,所以很好。我真的不喜歡的是當視圖和虛擬機不同步時。順便說一句,爲什麼這打破了MVVM模式? – blindmeis 2011-06-17 18:00:51

+0

因爲您建議在ViewModel中編寫邏輯來考慮視圖。視圖模型的工作是不擔心視圖是否有綁定錯誤。例如,如果要更改項目的可見性,則不要將視圖模型上的布爾值轉換爲可見性類型,而是在視圖上這樣做。 – 2011-06-18 00:58:31