清除时不会刷新TextBox绑定

时间:2013-06-19 05:58:54

标签: c# wpf canexecute

我有一个Form包含一些绑定到某个对象属性的TextBox:

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

我有一个“OK按钮”映射到这样的CanExecute()命令(不显示事件部分,但确保它有效):

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

问题:

  • 如果我将Car Id字段设置为某个按钮,则按钮正在启用。
  • 如果我删除了车辆ID的值,则没有任何反应。调试时,Car.CarId实际上仍然设置为我之前设置的值!

提前感谢您的提示!

4 个答案:

答案 0 :(得分:2)

假设CarId是int而不是string,您可能会收到FormatException。如果您创建IValueConverter并将其添加到绑定,则可以防止异常。

问题是当您输入CarId及其数字时,WPF可以绑定它并在VM中设置为值。但是下次,当值无效(意味着无法转换为int)时,将不会设置(WPF mscorelib.dll中出现异常),意味着旧值仍然存在。在这种情况下,将永远不会调用属性setter。

这样的事情:

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中(当然替换为您的命名空间):

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

然后:

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

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

答案 1 :(得分:2)

来自stackoverflow的另一个答案

  

int属性无法正常工作。是的,那么你的二传手不会被调用,即使转换器也不会被调用。如果您想要这样的行为,请在viewmodel中使用字符串属性,并在需要时将值转换为模型中的int属性

但你可以使用Nullable int和TargetNullValue =''

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

答案 2 :(得分:1)

如果您只删除TextBox的值,则检查CarID是否为“0”,这不会导致值为“0”。请尝试将CarId的类型更改为字符串,并在“CanExecute”--Method check againt string.Empty中更改,如下所示:

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

如果您需要CarId为Integer,则应将其设置为可为空并检查空值:

CarID声明:

int? CarID;

检查:

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

答案 3 :(得分:0)

添加到绑定

, UpdateSourceTrigger=PropertyChanged