Проблема WPF DependencyProperty с завершающим "." - PullRequest
0 голосов
/ 07 мая 2020

У меня проблема со свойством зависимостей настраиваемого элемента управления. Элемент управления в основном представляет собой текстовое поле с раскрывающейся цифровой панелью.

enter image description here

Когда пользователь нажимает кнопку на цифровой клавиатуре, текст добавляется к свойству зависимости InputValue. Все работает, как ожидалось, пока я не попробую добавить "." к стоимости недвижимости. Переменная value в наборе по-прежнему имеет символ "." (например: «1.»), но после SetValue, InputValue не имеет «.» (например: «1»)

Код выглядит следующим образом - OnInputValueChanged просто проверяет, является ли элемент управления вводом определенного типа c, и если да, то когда строка достигает определенной длины, закройте цифровую клавиатуру.

    public static readonly DependencyProperty InputValueProperty = DependencyProperty.Register("InputValue", typeof(String), typeof(TextBoxTouchNum), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsParentArrange, new PropertyChangedCallback(OnInputValueChanged)));
    public String InputValue
    {
        get => (String)GetValue(InputValueProperty);
        set
        {
            SetValue(InputValueProperty, value);
        }
    }

    public static void OnInputValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBoxTouchNum ctrl = (TextBoxTouchNum)d;
        String val = (String)ctrl.InputValue;

        if (val != null && ctrl.IsHeatNoEntry && val.Trim().Length == 8)
            if (ctrl.IsTouchScreen && ctrl.NumPadVisible)
            {
                ctrl.NumPadVisible = false;
                Keyboard.ClearFocus();
            }
    }

Если я заменю код для десятичной кнопки, нажмите, чтобы добавить что-то другое, например «.0», у меня будет «1.0», но как только я вернусь на конечный 0 , десятичная дробь снова пропадает.

Код обработчика нажатия кнопки:

    private void Decimal_Click(object sender, RoutedEventArgs e)
    {
        InputValue += ".";
    }

    private void Num0_Click(object sender, RoutedEventArgs e)
    {
        InputValue += "0";
    }

повторяется для кнопок 0-9

Привязка Xaml:

        <TextBox x:Name="TextBoxValue" 
             Width="{Binding TextBoxWidth}" 
             Text="{Binding InputValue, RelativeSource={RelativeSource AncestorType=UserControl}}"
             materialDesign:HintAssist.Hint="{Binding Hint}"
             Style="{StaticResource MaterialDesignFloatingHintTextBox}" 
             TextAlignment="Center"
             VerticalAlignment="Center" 
             Background="Transparent" />

Мне кажется, что значение где-то преобразуется в число c и отбрасывает обучающее ".".

Любые предложения будут оценены!

1 Ответ

0 голосов
/ 09 мая 2020

Если это свойство зависимости привязано к типу numeri c и UpdateSourceTrigger установлено на PropertyChanged, ввод точки (десятичный знак) немедленно установит свойство, и свойство get будет вызвано обратно в пользовательский интерфейс, что приведет к отсутствию точка (десятичный знак) видна.

Один из способов - отложить UpdateSourceTrigger до LostFocus, но я не думаю, что это возможно, потому что вы назначаете это в коде позади.

Таким образом, ваш единственный вариант - не привязывать его к типу numeri c и сохранять его в строковом типе.

...