Can I bind to a utility class?

前端 未结 1 1704
南旧
南旧 2021-01-13 14:45

I have a common class filled with generic functions like the one below to parse a text box:

public static void DoubleParse_KeyDown(object sender, KeyEventAr         


        
相关标签:
1条回答
  • 2021-01-13 15:20

    You want an Attached Behavior.

    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
    }
    

    In XAML use it with

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

    You can also set this in an WPF Style and have it reusable within all or many controls rather than adding the property each time manually.

    0 讨论(0)
提交回复
热议问题