WPF如何创建具有验证和绑定的自定义文本框

拉斐尔·拉文纳·维森特

我正在开发一个用于货币编辑的自定义文本框。
我已经看到了一些可以立即使用的工具,但是它们很复杂和/或无法真正使用,迫使您采取不良做法(例如,硬编码应该在控件上使用的名称)。
因此,我决定自己进行操作,但是在绑定选项上却遇到了麻烦,因为分配给绑定属性的属性必须是十进制,但是TextBox控件的Text属性可以接受字符串。
我认为的答案可能是,重写对基类(TextBox)中Text属性的访问方法(getter和setter),但不允许这样做。
我的绑定应该设置为值,该值设置TextBox的text属性,可以随时随地将其格式化为文本(包含货币符号和所有内容),但可以在Get方法上将其转换回数字数据类型。
到目前为止,这是我实现的目标:

public class CurrencyTextBox : TextBox
    {
        private bool IsValidKey(Key key)
        {
            int k = (int)key;
            return ((k >= 34 && k <= 43) //digits 0 to 9
                || (k >= 74 && k <= 83) //numeric keypad 0 to 9
                || (k == 2) //back space
                || (k == 32) //delete
                );
        }
        private void Format()
        {
            //formatting decimal to currency text here
            //Done! no problems here
        }
        private void FormatBack()
        {
            //formatting currency text to decimal here
            //Done! no problems here
        }
        private void ValueChanged(object sender, TextChangedEventArgs e)
        {
            this.Format();
        }
        private void MouseClicked(object sender, MouseButtonEventArgs e)
        {
            this.Format();
            // Prevent changing the caret index
            this.CaretIndex = this.Text.Length;
            e.Handled = true;
        }
        private void MouseReleased(object sender, MouseButtonEventArgs e)
        {
            this.Format();
            // Prevent changing the caret index
            this.CaretIndex = this.Text.Length;
            e.Handled = true;
        }
        private void KeyPressed(object sender, KeyEventArgs e)
        {
            if (IsValidKey(e.Key))
                e.Handled = true;
            if (Keyboard.Modifiers != ModifierKeys.None)
                return;
            this.Format();
        }
        private void PastingEventHandler(object sender, DataObjectEventArgs e)
        {
            // Prevent copy/paste
            e.CancelCommand();
        }
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            // Disable copy/paste
            DataObject.AddCopyingHandler(this, PastingEventHandler);
            DataObject.AddPastingHandler(this, PastingEventHandler);
            this.CaretIndex = this.Text.Length;
            this.PreviewKeyUp += KeyPressed;
            this.PreviewMouseDown += MouseClicked;
            this.PreviewMouseUp += MouseReleased;
            this.TextChanged += ValueChanged;
            this.Format();
        }
    }

这是XAML:

<MyNamespace:CurrencyTextBox x:Name="TxbCurrency" Text="{Binding Path=DataContext.Element.Currency, ValidatesOnDataErrors=True}" />

到目前为止,一切都很好!从十进制属性到TextBox文本的绑定是“正确”。但是现在问题是如何在文本编辑后从文本中获取小数。
从十进制到.Text的绑定使用装箱隐藏ToString()方法。
问题在这里:在这种情况下,如何从十进制重载Parse()方法以使用FormatBack()方法从TextBox的Text获取十进制?

萨菲

Dependency Property像这样创建新的

public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register(
         "Value", 
         typeof(decimal?),
         typeof(CurrencyTextBox),
         new FrameworkPropertyMetadata(
                     new decimal?(), 
                     FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
                     new PropertyChangedCallback(ValuePropertyChanged)));

private static void ValuePropertyChanged(
                         DependencyObject d,
                         DependencyPropertyChangedEventArgs e)
{
    CurrencyTextBox x = (CurrencyTextBox)d;
    x.Value = (decimal?)e.NewValue;
}

然后绑定到这个新属性

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有十进制格式的WPF自定义文本框

来自分类Dev

具有十进制格式的WPF自定义文本框

来自分类Dev

如何自定义文本框和组合框边框WPF

来自分类Dev

WPF + Caliburn Micro:将文本框绑定到自定义对象

来自分类Dev

在自定义WPF文本框上检测绑定错误

来自分类Dev

在 Access 中将 VBN 文本框文本与具有自定义格式的自动编号匹配

来自分类Dev

如何为格式化数字的文本框设置自定义绑定?

来自分类Dev

如何创建自定义文本框和文本视图

来自分类Dev

WPF - 应用程序中所有文本框的自定义错误模板

来自分类Dev

具有自定义样式的文本框不会触发GotFocus

来自分类Dev

Android:如何创建这样的自定义编辑文本框?

来自分类Dev

如何在Angular 9中创建自定义文本框组件

来自分类Dev

如何在mvc中为文本框创建自定义html帮助器

来自分类Dev

如何以文本框输入自定义格式?

来自分类Dev

如何验证具有时间值的动态创建的文本框

来自分类Dev

VBScript自定义文本框

来自分类Dev

自定义输入文本框

来自分类Dev

具有自定义类型和插入控件的WPF ListView绑定

来自分类Dev

如何实现文本框的绑定验证?

来自分类Dev

将鼠标悬停在WPF中的按钮上时如何显示自定义文本框

来自分类Dev

C#wpf-如何在自定义控件中将文本框错误传递给父级

来自分类Dev

使用Knockout + Typeahead自定义绑定更新文本框中的值

来自分类Dev

如何创建具有剔除绑定的自定义滚动条(jScrollPane)?

来自分类Dev

VB.net中的自定义验证要求用户将文本框加到100

来自分类Dev

XPages-Dojo验证文本框-自定义消息

来自分类Dev

为什么自定义窗口中的文本框验证不起作用?

来自分类Dev

WPF如何在文本框中使用验证规则而不创建要在对话框中绑定的额外属性?

来自分类Dev

WPF如何在文本框中使用验证规则而不创建要在对话框中绑定的额外属性?

来自分类Dev

除自定义文本框外的中心文本

Related 相关文章

  1. 1

    具有十进制格式的WPF自定义文本框

  2. 2

    具有十进制格式的WPF自定义文本框

  3. 3

    如何自定义文本框和组合框边框WPF

  4. 4

    WPF + Caliburn Micro:将文本框绑定到自定义对象

  5. 5

    在自定义WPF文本框上检测绑定错误

  6. 6

    在 Access 中将 VBN 文本框文本与具有自定义格式的自动编号匹配

  7. 7

    如何为格式化数字的文本框设置自定义绑定?

  8. 8

    如何创建自定义文本框和文本视图

  9. 9

    WPF - 应用程序中所有文本框的自定义错误模板

  10. 10

    具有自定义样式的文本框不会触发GotFocus

  11. 11

    Android:如何创建这样的自定义编辑文本框?

  12. 12

    如何在Angular 9中创建自定义文本框组件

  13. 13

    如何在mvc中为文本框创建自定义html帮助器

  14. 14

    如何以文本框输入自定义格式?

  15. 15

    如何验证具有时间值的动态创建的文本框

  16. 16

    VBScript自定义文本框

  17. 17

    自定义输入文本框

  18. 18

    具有自定义类型和插入控件的WPF ListView绑定

  19. 19

    如何实现文本框的绑定验证?

  20. 20

    将鼠标悬停在WPF中的按钮上时如何显示自定义文本框

  21. 21

    C#wpf-如何在自定义控件中将文本框错误传递给父级

  22. 22

    使用Knockout + Typeahead自定义绑定更新文本框中的值

  23. 23

    如何创建具有剔除绑定的自定义滚动条(jScrollPane)?

  24. 24

    VB.net中的自定义验证要求用户将文本框加到100

  25. 25

    XPages-Dojo验证文本框-自定义消息

  26. 26

    为什么自定义窗口中的文本框验证不起作用?

  27. 27

    WPF如何在文本框中使用验证规则而不创建要在对话框中绑定的额外属性?

  28. 28

    WPF如何在文本框中使用验证规则而不创建要在对话框中绑定的额外属性?

  29. 29

    除自定义文本框外的中心文本

热门标签

归档