我在Xamarin Forms ContentPage上有一个条目,我已将其绑定到ViewModel属性QtyIn,该属性是Int32:
private int _qtyIn;
public int QtyIn
{
get { return _qtyIn; }
set
{
if (_qtyIn != value)
{
_qtyIn = value;
RaisePropertyChanged("QtyIn");
}
}
}
这是我的XAML:
<Entry Text="{Binding Path=Source.QtyIn, Mode=TwoWay, Converter={StaticResource intToStringConverter}}" />
我的IValueConverter:
public class IntToStringConverter : IValueConverter
{
// from Int32 to String
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString();
}
// String to Int
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
int parsedInt = 0;
if (int.TryParse(value.ToString(), out parsedInt))
{
return parsedInt;
}
return value;
}
}
问题是,当我尝试输入一个以减号"-"开头的负数时,绑定失败,因为它无法将"-"转换为Int32。这是我在Android设备上运行此应用程序时在单声道输出中看到的错误:
05-03 15:19:27.923 I/mono-stdout(19384): Binding: - can not be converted to type 'System.Int32'
有人知道如何将整数绑定到允许负数的Text属性吗?我在Xamarin的网站或论坛上找不到任何关于这方面的文档。
在WPF中,我会使用UpdateSourceTrigger=LostFocus属性只在输入整数后进行转换,但Xamarin Forms没有这个属性。
如果传递的值是"-",您是否尝试过返回0?
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
int parsedInt = 0;
if (value == "-") return 0;
if (int.TryParse(value.ToString(), out parsedInt))
{
return parsedInt;
}
return value;
}
问题是,返回value
,这是一个具有-的字符串,并尝试将其传递给Int32
(返回ViewModel中)。
相反,将第二种状态放入您的逻辑中。如果解析失败,则返回null-这也有助于避免任何其他字符输入的问题。
public class IntToStringConverter : IValueConverter
{
// from Int32 to String
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value?.ToString() ?? "";
}
// String to Int
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
int parsedInt = 0;
if (int.TryParse(value.ToString(), out parsedInt))
{
return parsedInt;
}
return null;
}
}
这是ViewModel:
private int? _qtyIn;
public int? QtyInNullable // you should bind on this one in your entry
{
get { return _qtyIn; }
set
{
if (_qtyIn != value)
{
_qtyIn = value;
if (value != null)
OnPropertyChanged("QtyInNullable");
OnPropertyChanged("QtyIn");
}
}
}
public int QtyIn // you should bind on this one in your entry
{
get { return _qtyIn ?? 0; }
}
并绑定它:
<Entry Text="{Binding Path=Source.QtyInNullable, Mode=TwoWay, Converter={StaticResource intToStringConverter}}" />