我有一个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;
}
问题:
提前感谢您的提示!
答案 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