【问题标题】:Cannot bind a negative Integer to an Entry Text无法将负整数绑定到条目文本
【发布时间】:2016-08-29 01:11:55
【问题描述】:

我在 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 没有此属性可用。

【问题讨论】:

  • 所以你的要求是:如果Text无效(不能转换为int),QtyIn应该设置为0,或者?
  • 我的要求是,如果我尝试输入数字 -123,它应该允许我将它输入到条目中。当我键入一个 - 时,它不是一个有效的整数,因此文本更改为 0。该属性应该仅在条目失去焦点时更改,但是 Xamarin Forms 没有 UpdateSourceTrigger=LostFocus 属性。
  • 你在哪个平台上测试?在我的测试用例(android,绑定 without 转换器)中,它只会产生警告,并且只会在可以转换的情况下更新属性。
  • 我正在 Android (API 19) 上进行测试。我删除了我的 IValueConverter,每当我按屏幕键盘上的“-”键时都会看到这个:05-04 10:12:42.683 I/mono-stdout(21775): Binding: - can't be convert to type 'System. Int32'
  • 是的,这只是警告。如果您进一步输入,该属性会正确更新。

标签: xaml mvvm data-binding xamarin xamarin.forms


【解决方案1】:

如果传递的值为“-”,您是否尝试过返回 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;
}

【讨论】:

  • 是的,但这只是将条目文本更改为 0,并删除了我刚刚在键盘上键入的 -。
  • 我会提交一个错误,看看他们怎么说:bugzilla.xamarin.com
  • 我在他们的论坛上发帖,正在等待有人回复。我不认为这一定是一个错误(据我了解它在做什么),我只需要一种解决方法,最好需要它们来实现 UpdateSourceTrigger。
【解决方案2】:

您的问题是,您返回 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}}" />

【讨论】:

  • 我了解问题所在,Xamarin Forms 没有可以解决此问题的 UpdateSourceTrigger=LostFocus 属性。返回零只会覆盖我用“0”键入的条目“-”。没有办法进入例如-123。每当我输入 a - 它都会变为 0。
  • 啊,我明白了。在这种情况下,你应该做更多的工作来检查这种不同的状态——我改变了我的答案。
  • 您知道是否将 ViewModel 属性更改为可为空的 int 吗?真的解决了这个问题吗?如果是这样,那将非常简单且很有帮助。
  • 好吧,我又改变了一次,只为这种情况引入了第二个属性。那你就没有副作用了
  • 这不行,绑定:- 不能转换为类型'System.Nullable`1[System.Int32]'
猜你喜欢
  • 2021-06-22
  • 2010-12-02
  • 1970-01-01
  • 2013-08-11
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多