我有一个表单,包含一些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