Преобразователь строки в двойной с IValueConverter C # - PullRequest
0 голосов
/ 03 января 2019

У меня есть вид, в котором я должен иметь возможность вводить двойные числа. Дело в том, что я могу вводить только целые числа, такие как «100», но не «100.4». Все мои фоновые расчеты выполняются на удвоениях. Сейчас я пытаюсь обойти эту проблему путем реализации StringToDoubleConverter, но мои знания C # по-прежнему очень ограничены.

Я внедрил это в мой UserControl.Resources тег

<local:StringToDoubleConverter x:Key="StringToDouble"/>

и создал новый класс StringToDoubleConverter:

class StringToDoubleConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string stringNumber = value as string;
            double.TryParse(stringNumber, out double val);
            return val;
        }
    }

Наконец-то я реализовал конвертер в моей привязке:

<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DelayModel.DelayTime, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource StringToDouble}}"/>

Мой DelayTime в моем DelayModel выглядит так:

private double _delayTime;

public double DelayTime
{
    get
    {
        return _delayTime;
    }
    set
    {
        if (value != _delayTime)
        {
            _delayTime = value; NotifyPropertyChanged();
        }
    }
}

Я знаю, что мой конвертер как-то не так. Я изо всех сил пытаюсь получить правильный код для преобразования строки, которую я хочу ввести в моем представлении, в удвоенные значения.

Например: я хочу ввести «0,7» в свой просмотр, и DelayTime должен получить «0,7», а не только «7». Является ли TryParse oder double.Parse (значение) правильным?

1 Ответ

0 голосов
/ 03 января 2019

Вам не нужен StringToDoubleConverter.

Проблема в использовании UpdateSourceTrigger = PropertyChanged. Он обновляет источник после нажатия каждой клавиши. Если вы поставите символ точки, он обновит источник со строковым значением «0». что даст вам обратно "0" без точки. Вы можете изменить UpdateSourceTrigger на Default и обновить Source вручную, когда вы нажимаете Enter с событием KeyDown

<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DelayModel.DelayTime}" KeyDown="TextBox_KeyDown"/>

и код позади

private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.Key == Key.Enter)
            (sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...