2013-06-12 47 views
0

處理RelayCommand我有一個屬性,它看起來像這樣:int屬性在MVVM

private int _wertungvalue; 
public int WertungValue 
{ 
    get { return _wertungvalue; } 
    set 
    { 
     _wertungvalue = value; 
     RaisePropertyChanged(() => WertungValue); 
    } 
} 

它綁定到一個TextBox

<TextBox Text="{Binding WertungValue, Mode=TwoWay}"/> 

因此,用戶可以輸入任何他想要的(我不你想要一個數字文本框!)。用戶鍵入'5',WertungValue的值爲5.如果用戶鍵入'Test',則會彈出一個紅色邊框,並且WertungValue的值仍然是5!

現在我也有一個RelayCommand

RelayCommand(DeleteExecute,CanDelete); 

在CanDelete,我檢查,如果屬性爲一個int

private bool CanDelete() 
{ 
    int ot = 0; 

    if (int.TryParse(WertungValue.ToString(),out ot) == false) 
     return false; 
    else 
     return true; 
} 

使得RelayCommand應只工作,當該值是一個整數。所以這意味着當用戶鍵入'Test'時,RelayCommand應該返回false。問題是它永遠不會返回false,因爲該屬性的值始終是一個整數,但在View中它是一個字符串。

我不想讓屬性鍵入字符串或在我的TextBox中使用UpdateSourceTrigger = PropertyChanged。我也不想僅僅創建一個數字TextBox ...用戶應該被允許輸入他想要的任何東西,但是RelayCommand只能在他輸入一個整數時才起作用。

+0

你不能做你想做的。你會得到一個綁定錯誤,你的「設置」永遠不會被你的財產調用。將「UpdateSourceTrigger」設置爲「PropertyChanged」不會解決問題。你不需要讓你的單個屬性成爲一個字符串......但是你應該添加第二個屬性來綁定你的文本框。 – Thelonias

回答

1

我不認爲這是可能的一個int屬性。當綁定更新屬性時,它會嘗試將該值轉換爲整數,當用戶輸入'測試'時會導致異常,因此該值永遠不會更新並保留爲5.

我認爲您需要兩個屬性:一個字符串類型,以及一個int類型(或者可能是int?)。該文本框綁定到字符串屬性,並在setter中,您可以檢查是否可以解析該值並相應地更新int屬性。

+0

K,thx。但我很好奇這個視圖如何檢查Binding類型。它必須做一個TryParse(或其他)來檢查輸入的類型。而不是在財產上做,它在......中做到了。我的意思是在Binding和Property之間必須有一些東西來檢查輸入的類型。 – Rudi

+0

它檢查你的財產的類型,並看到'int'。因此它需要將字符串轉換爲整數才能調用setter。如果此轉換失敗,則會引發異常,並且不會調用您的屬性的設置器。 –

+0

有什麼辦法可以訪問這個異常(在我的ViewModel中)? – Rudi