限制从类输入到文本框中的字母字符

本文关键字:字符 文本 输入 | 更新日期: 2023-09-27 18:05:58

我有一个代码,限制文本框输入数字,破折号和空格。它在包含文本框的窗口中运行良好。

    public static bool IsTextAllowed(string text)
    {
        //regex that matches disallowed text
        Regex regex = new Regex("[^0-9,-]+");
        return !regex.IsMatch(text);
    }
    private void textbox1_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        e.Handled = !IsTextAllowed(e.Text);
    }

然而,我想做的是把代码放入一个类,这样我就可以从多个窗口和页面访问它。这是不太顺利的部分。

我创建了一个名为rules的类,并将bool方法复制到其中。我无法找出一种方法来让事件处理程序在类中工作,所以我试图将该方法产生的字符串值传递给另一个字符串,并将其绑定到"textbox1"。代码如下:

public class rules : INotifyPropertyChanged
{
    // String to contain passed on value from the regrex code
    string integers;
    //Method to pass on value to the string 'integers'
    public bool this[string Digits]
    {
        get
        {
            //regex that matches disallowed text
            Regex regex = new Regex("[^0-9,-]+");
            return !regex.IsMatch(integers);
        }
    }
    //Binding
    public string Number
    {
        get
        {
            return integers;
        }
        set
        {
            if (integers != value)
            {
                integers = value;
                RaisePropertyChanged("Number");
            }
        }
    }
    private void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged (this, new PropertyChangedEventArgs(prop));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

在窗口后面的代码中,我有'textbox1'在我设置数据上下文。

    public signup()
    {
        InitializeComponent();
        Rules = new rules();
        this.DataContext = Rules;
    }

然后在xaml:

中将'textbox1'绑定到它
    <TextBox x:Name="textbox1" Text="{Binding Number, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />

显然我做错了什么,因为它接受任何字符输入。

还有别的办法吗?

限制从类输入到文本框中的字母字符

在预览中,您正在使用e.Handled

取消输入

在setter中允许输入
文本框仍然有值-您没有做任何重置值

应该可以
通过调用RaisePropertyChanged("Number");如果istextalallowed (value)

if (integers == value) return;
if (IsTextAllowed(value)) { integers = value; }
RaisePropertyChanged("Number");