Xamarin.Forms Numeri c Вводная запятая и точка не работает - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть поле ввода в Xamarin.Forms.

В Android я не могу ввести запятую или точку, чтобы сделать десятичные дроби. Запись только принимает целые числа. Что мне нужно изменить, чтобы можно было вводить десятичные дроби?

Xaml:

<Entry Keyboard="Numeric" Text="{Binding Price1}" Placeholder="Price"/>

Страница содержимого cs:

        private decimal price1;
        public string Price1
        {
            get { return (price1).ToString(); }
            set
            {
                price1 = Convert.ToDecimal((String.IsNullOrEmpty(value)) ? null : value);

                OnPropertyChanged(nameof(Price1));
            }
        }

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

Самый быстрый способ - создать строковое свойство с привязкой и преобразовать его в десятичное при его использовании.

ViewModel

    private string price1;
    public string Price1
    {
        get { return price1; }
        set
        {
            price1 = value;

            OnPropertyChanged(nameof(Price1));
        }
    }

Использование

 decimal f = Convert.ToDecimal(Price1);
0 голосов
/ 27 апреля 2020

Как заметил @Cole Xia - MSFT, проблема с кодом в вопросе заключается в том, что входные данные немедленно преобразуются из строки в десятичную. Это приводит к удалению десятичной точки / запятой во время преобразования. Поэтому вы должны хранить содержимое записи в виде строки в течение всего времени и преобразовывать его в тип нумерации c во время использования.

0 голосов
/ 27 апреля 2020

По моему опыту, Xamarin - это боль с десятичным отображением. Вы заканчиваете тем, что вводите любую сторону десятичной точки, и ее поведение никогда не является последовательным.

Я считаю, что гораздо проще, когда ViewModel предоставляет недесятичное целочисленное значение и использует преобразователь значения для отображения его в виде десятичной дроби .

например

<Label x:Name="CpvValueText" Text="{Binding ScaledValue, Mode=OneWay, Converter={x:StaticResource DecimalConverter}}" />

...

   /// <summary>
    /// This helper class converts integer values to decimal values and back for ease of display on Views
    /// </summary>
    public class DecimalConverter : IValueConverter
    {
        /// <inheritdoc />
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (null == value)
            {
                return 0;
            }

            var dec = ToDecimal(value);
            return dec.ToString(CultureInfo.InvariantCulture);
        }

        /// <inheritdoc />
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var strValue = value as string;
            if (string.IsNullOrEmpty(strValue))
            {
                strValue = "0";
            }

            return decimal.TryParse(strValue, out var result) ? result : 0;
        }
    }
...