Как прикрепить событие PreviewKeyDown к объекту Dependency при создании экземпляра?

Я хочу прикрепить событие PreviewKeyDown к моему объекту зависимости от объекта.

Код:

public class PriceFieldExtension : DependencyObject
{
    public static decimal GetPriceInputField(DependencyObject obj)
    {
        return (decimal)obj.GetValue(PriceInputFieldProperty);
    }

    public static void SetPriceInputField(DependencyObject obj, decimal value)
    {
        obj.SetValue(PriceInputFieldProperty, value);
    }

    public static readonly DependencyProperty PriceInputFieldProperty =
        DependencyProperty.RegisterAttached("PriceInputField", typeof (decimal), typeof (PriceFieldExtension), new FrameworkPropertyMetadata(0.00M, new PropertyChangedCallback(OnIsTextPropertyChanged)));

    private static void OnIsTextPropertyChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {

        TextBox targetTextbox = d as TextBox;
        if (targetTextbox != null)
        {
                targetTextbox.PreviewKeyDown += targetTextbox_PreviewKeyDown;
        }

    }
    static void targetTextbox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        e.Handled = (e.Key == Key.Decimal);
    }
}

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

Основная проблема заключается в том, что я хочу, чтобы текстовое поле принимало только десятичные дроби, но здесь есть одна загвоздка: Когда я набираю текстовое поле, событие TextChanged запускается так:

  • 0 огонь
  • 0, не стреляйте
  • 0,0 огонь
  • 0,00 огонь
  • 0, 00 не стреляют

Xaml:

<TextBox Text="{Binding InputPrice, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged, StringFormat=F2}" Style="{StaticResource DefaultTextBox}" classes:PriceFieldExtension.PriceInputField="{Binding InputPrice, StringFormat=F2, Converter={StaticResource StringToDecimalConverter}}" TextAlignment="Right"  Margin="0,6,0,0" Height="45">
                        </TextBox>

если я изменю свойство InputPrice на string, событие TextChanged будет срабатывать каждый раз.

Я хочу избежать этой несоответствия, ловя нажатие клавиши ",". Может быть есть лучшие решения?

1 ответ

Как насчет использования замаскированного текстового поля: https://marlongrech.wordpress.com/2007/10/28/masked-textbox/

Другие вопросы по тегам