文本框绑定在清除时不刷新



我有一个表单,包含一些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字段设置为某事,则按钮是启用的。
  • 如果我删除Car Id的值,什么也不会发生。调试,汽车。CarId实际上仍然被设置为我之前设置的值!

提前感谢你的建议!

来自stackoverflow的另一个答案

int属性不能工作。是的,你的setter不会被调用,甚至转换器也不会被调用。如果您想要这样的行为,请在视图模型中使用字符串属性,并在需要时将值转换为模型中的int属性

但是你可以使用Nullable int与TargetNullValue= "

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

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

问题是当你输入一个卡和它的一个数字,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}}"/>

你正在检查如果CarID是"0",如果你只是删除文本框的值,这将不会导致一个值为"0"。请尝试将id类型更改为字符串,并在"CanExecute"方法中检查字符串。空,像这样:

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

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

CarID声明:

int? CarID;

检查:

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

添加到绑定

, UpdateSourceTrigger=PropertyChanged

相关内容

  • 没有找到相关文章

最新更新