无法将负整数绑定到条目文本



我在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}}" />

最新更新