2013-06-19 42 views
0

我有一個包含一些文本框綁定到其他對象屬性的一種形式:文本框綁定不會刷新

<Label Content="Car Id:"/> 
<TextBox Text="{Binding Path=Car.CarId, Mode=TwoWay}"/> 

我有一個「OK按鈕」被映射到這樣的CanExecute()命令(不顯示事件的一部分,但可以肯定它的工作原理):

private bool CanExecute() 
{ 
    return _vm.Model.Car.CarId !=0; 
} 

問題:

  • 如果我訂車ID字段的東西,按鈕是ENABL ING。
  • 如果我刪除了車輛ID的值,則什麼都不會發生。調試時,Car.CarId實際上仍然設置爲我以前設置的值!

在此先感謝您的提示!

+0

有你在Car類中實現了'INotifyPropertyChanged'嗎? –

+0

CarId是什麼類型?詮釋? –

+0

如果carid是int - 那麼當你清除你的文本框時你的setter不會被打。使用帶驗證的字符串類型將是最簡單的方法 – blindmeis

回答

1

如果您剛剛刪除文本框的值,那麼您將檢查CarID是否爲「0」,這不會導致值爲「0」。請儘量CarId的類型更改爲字符串,並在「CanExecute」 - 方法檢查againt的String.Empty,像這樣:

private bool CanExecute() 
{ 
    return _vm.Model.Car.CarId != string.Empty; 
} 

如果您需要CarId是一個整數,你應該將它設置可空和檢查對一個空值:

CarID宣言:

int? CarID; 

檢查:

private bool CanExecute() 
{ 
    return _vm.Model.Car.CarId != null; 
} 
+0

我也考慮過可空int,但好像Binding將空輸入填充爲空字符串,而不是null,所以CarId的setter不會被調用。所以你必須在ConvertBack()方法中包含一個將空字符串轉換爲空的轉換器 - 方法 –

+0

由於用戶可以將數據輸入到TextBox中,並且它在更新綁定之前似乎沒有檢查合格的整數(因爲它是雙向的)我會建議使用字符串作爲數據類型的CarId。或者爲了實現我在之前的句子中描述的行爲以及像Florian GI這樣的轉換器(可能都在轉換器中)。 –

+0

如果使用字符串作爲類型,我會建議添加一個驗證器來檢查輸入是否爲整數:http://wpftutorial.net/DataValidation.html因此@goul在轉換爲int時不需要檢查它。 –

0

添加到結合​​

, UpdateSourceTrigger=PropertyChanged 
2

假設CarId是int,而不是string你可能收到出現FormatException。如果您創建IValueConverter並將其添加到綁定中,您可以防止發生異常。

問題是,當您輸入一個CarId及其一個數字時,WPF可以綁定它並將其設置爲虛擬機中的值。但下一次,當值無效(意味着不可轉換爲int)將不會被設置(WPF mscorelib.dll中的異常事件),意味着舊值仍然存在。在這種情況下,屬性設置器將不會被調用。

事情是這樣的:

public class FallbackConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    int v = 0; // default if no value provided or value is not convertible to int 
    if (value != null) 
    { 
     var result = int.TryParse(value.ToString(), out v); 
    } 

    return v; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    string result = string.Empty; 
    if (value != null) 
    { 
     result = value.ToString(); 
    } 

    return result; 
    } 

}

在XAML(ofcourse替換成您的命名空間):

xmlns:converter="clr-namespace:Client.ViewModels.Converters" 

然後:

<converter:FallbackConverter x:key="FallbackConverter "/> 

<TextBox Text="{Binding Path=Car.CarId, Mode=TwoWay, Converter={StaticResource FallbackConverter}}"/> 
0

從這裏另外一個答案在stackoverflow上

int屬性無法工作。是的,那麼你的setter不會被調用,即使是一個轉換器也不會被調用。如果你想這樣的行爲在您的視圖模型使用字符串屬性和值,如果需要

轉換成你的整型屬性在模型中,但你可以使用可空INT與TargetNullValue =「」

<TextBox Text="{Binding MyNullableInt, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, TargetNullValue=''}"/>