Can I bind to a utility class?

I have a generic class populated using common functions like the one below to parse a text field:

public static void DoubleParse_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Decimal)
    {
        var textBox = sender as TextBox;
        if (textBox != null)
            textBox.Text += Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator);
    }
    else
    {
        e.Handled = (e.Key >= Key.D0 && e.Key <= Key.D9) ||
                    (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || 
                    e.Key == Key.Back || e.Key == Key.Delete ||
                    e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Unknown;
    }
}

I thought I could use this everywhere on my pages as the only source for keydown events for a TextBox. New to implementing MVVM in WP8, curious, is there any way to achieve this?

In the spirit of MVVM (although I'm not a purist), I understand that this does not have to be in the viewmodel, but I still like its centralization.

Quick note:

  • The class is not static, I understand that I can not use it directly in xaml.
  • I was thinking of making a class like StaticResource and referring to functions in xaml. But that does not work.
  • .
+4
1

.

public static class TextBoxBehavior
{
    public static bool GetAllowOnlyDecimalInput(TextBox texbox)
    {
        return (bool)texbox.GetValue(AllowOnlyDecimalInputProperty);
    }

    public static void SetAllowOnlyDecimalInput(
      TextBox texbox, bool value)
    {
        texbox.SetValue(AllowOnlyDecimalInputProperty, value);
    }

    public static readonly DependencyProperty AllowOnlyDecimalInputProperty =
        DependencyProperty.RegisterAttached(
        "AllowOnlyDecimalInput",
        typeof(bool),
        typeof(TextBox),
        new PropertyMetadata(false, OnAllowOnlyDecimalInputChanged));

    static void OnAllowOnlyDecimalInputChanged(
      DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        TextBox item = depObj as TextBox;
        if (item == null)
            return;

        if (e.NewValue is bool == false)
            return;

        if ((bool)e.NewValue)
            item.KeyDown += OnTextBoxDoubleParse_KeyDown;
        else
            item.KeyDown -= OnTextBoxDoubleParse_KeyDown;
    }

    static void OnTextBoxDoubleParse_KeyDown(object sender, KeyEventArgs e)
    {
        if (!Object.ReferenceEquals(sender, e.OriginalSource))
            return;

        TextBox item = e.OriginalSource as TextBox;
        if (item != null) {
            if (e.Key == Key.Decimal)
            {
                var textBox = sender as TextBox;
                if (textBox != null)
                    textBox.Text += Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator);
            }
            else
            {
                e.Handled = (e.Key >= Key.D0 && e.Key <= Key.D9) ||
                            (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || 
                            e.Key == Key.Back || e.Key == Key.Delete ||
                            e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Unknown;
            }
        }
    }

    #endregion // AllowOnlyDecimalInput
}

XAML

<TextBox my:TextBoxBehavior.AllowOnlyDecimalInput="True" />

WPF , .

+3

All Articles