2013-06-19 37 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=''}"/>