Доступ к полному связанному значению текстового поля в прикрепленном свойстве - PullRequest
0 голосов
/ 28 мая 2018

С прикрепленным свойством я хочу удалить / увеличить значение текстового поля на это значение при нажатии Key.Up или Key.Down.

Я определил следующее свойство:

public static readonly DependencyProperty SmallFloatIncrementProperty = DependencyProperty.RegisterAttached(
      "SmallFloatIncrement",
      typeof(double),
      typeof(InputService),
      new UIPropertyMetadata(0.1));

    public static double GetSmallFloatIncrement(DependencyObject d)
    {
        return (double)d.GetValue(SmallFloatIncrementProperty);
    }

    public static void SetSmallFloatIncrement(DependencyObject d, double value)
    {
        d.SetValue(SmallFloatIncrementProperty, value);
    }

Я также зарегистрировался для PreviewKeyDown на моем TextBox и обработал его следующим образом:

    if(e.Key == Key.Up)
    {
      IncrementOrDecrementValue((DependencyObject)sender, true);
    }
    else if (e.Key == Key.Down)
    {
      IncrementOrDecrementValue((DependencyObject)sender, false);              
    }

...

    private static void IncrementOrDecrementValue(DependencyObject sender, bool doIncrement)
    {
        if (sender is TextBox)
        {
          TextBox tb = (TextBox)sender;
          var increment = GetSmallFloatIncrement((DependencyObject)sender);

          var text = tb.Text;
          double textBoxValue = 0.0;
          if (!string.IsNullOrEmpty(text))
          {
             try{
               textBoxValue = Convert.ToDouble(text, FormatProvider);
             }
             catch (FormatException)   { }
          }

          tb.Text = Convert.ToString((doIncrement) ? textBoxValue + increment : textBoxValue - increment, FormatProvider);
          ValidateResult(sender);        
        }
    }

Я сталкиваюсь с проблемами при получении значениятекстовое окно.Если, например, свойство bounded имеет значение 1.234, но в привязке определен StringFormat = N1, вызов tb.Text доставляет 1.2 вместо всего значения.Но мне нужно увеличить исходное значение на указанную сумму (значение должно быть кратным приращению).Есть ли способ получить полное значение ограничения текстового поля?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 28 мая 2018

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

public static double GetSmallFloatIncrement(DependencyObject obj)
{
    return (double)obj.GetValue(SmallFloatIncrementProperty);
}

public static void SetSmallFloatIncrement(DependencyObject obj, double value)
{
    obj.SetValue(SmallFloatIncrementProperty, value);
}

public static readonly DependencyProperty SmallFloatIncrementProperty =
    DependencyProperty.RegisterAttached("SmallFloatIncrement", typeof(double), typeof(TextBoxExtensions),
        new PropertyMetadata(0.0));

Еще одно присоединенное свойство для реализации этой функциональности и включения / выключения его:

public static bool GetSmallFloatIncrementOn(DependencyObject obj)
{
    return (bool)obj.GetValue(SmallFloatIncrementOnProperty);
}

public static void SetSmallFloatIncrementOn(DependencyObject obj, bool value)
{
    obj.SetValue(SmallFloatIncrementOnProperty, value);
}

public static readonly DependencyProperty SmallFloatIncrementOnProperty =
    DependencyProperty.RegisterAttached("SmallFloatIncrementOn", typeof(bool), typeof(TextBoxExtensions),
        new PropertyMetadata(false, OnSmallFloatIncrementOn));

static void OnSmallFloatIncrementOn(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var textBox = (TextBox)d;

    void OnKeyDown(object sender, KeyEventArgs keyArgs)
    {
        if (keyArgs.Key == Key.Up)
            IncrementOrDecrementValue(textBox, .01);
        else if (keyArgs.Key == Key.Down)
            IncrementOrDecrementValue(textBox, -.01);
    }

    if ((bool)e.NewValue)
        textBox.PreviewKeyDown += OnKeyDown;
    else
        textBox.PreviewKeyDown -= OnKeyDown;
}

Теперь функция приращения становится простой.:

static void IncrementOrDecrementValue(TextBox textBox, double inc)
{
    var cur = GetSmallFloatIncrement(textBox);
    SetSmallFloatIncrement(textBox, cur + inc);
}

И теперь мы можем использовать его:

<TextBox Text="{Binding VMValue, StringFormat=F1}" 
             local:TextBoxExtensions.SmallFloatIncrement="{Binding VMValue, Mode=TwoWay}"
             local:TextBoxExtensions.SmallFloatIncrementOn="True"/>

Примечание: с этими значениями приращения и формата строки вам придется нажимать клавишу 10 раз, пока вы не увидите значениеизменить в TextBox.Но это то, что вы можете настроить на свой вкус.

...