1

我有一个表单,其中包含一些绑定到某个对象属性的 TextBox:

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

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

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

问题:

  • 如果我将 Car Id 字段设置为某个值,则该按钮处于启用状态。
  • 如果我删除 Car Id 的值,则不会发生任何事情。调试一下,Car.CarId 实际上还是设置为我之前设置的值!

提前感谢您对此的提示!

4

4 回答 4

3

来自stackoverflow上的另一个答案

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

但是您可以将 Nullable int 与 TargetNullValue='' 一起使用

<TextBox Text="{Binding MyNullableInt, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, TargetNullValue=''}"/>
于 2013-06-19T08:43:18.617 回答
2

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

问题是当您输入 CarId 及其数字时,WPF 可以绑定它并将其设置为 VM 中的值。但是下一次,当值无效时(意味着不能转换为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 中(当然替换为您的命名空间):

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

然后:

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

<TextBox Text="{Binding Path=Car.CarId, Mode=TwoWay, Converter={StaticResource FallbackConverter}}"/>
于 2013-06-19T07:00:14.850 回答
1

如果您只是删除 TextBox 的值,您正在检查 CarID 是否为“0”,这不会导致值为“0”。请尝试将 CarId 的类型更改为字符串,并在“CanExecute”方法中再次检查 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;
}
于 2013-06-19T06:05:05.200 回答
0

添加到绑定

, UpdateSourceTrigger=PropertyChanged
于 2013-06-19T06:05:11.037 回答