По сути, вы не хотите изменять значение текстового поля, вы хотите изменить значение модели представления с помощью клавиш.Поэтому правильное решение состоит в том, чтобы связать это поведение непосредственно с моделью представления.Итак, вот прикрепленное свойство, содержащее само значение.
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.Но это то, что вы можете настроить на свой вкус.