我有一个代码可以将文本框输入限制为数字,破折号和空格。它在包含文本框的窗口中工作正常。
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',我设置了datacontext。
public signup()
{
InitializeComponent();
Rules = new rules();
this.DataContext = Rules;
}
然后我在xaml中将'textbox1'绑定到它:
<TextBox x:Name="textbox1" Text="{Binding Number, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
显然我做错了,因为它接受任何角色。
到底有没有?
答案 0 :(得分:1)
在预览中,您将使用e.Handled
取消输入在设定者中,您允许输入
TextBox仍然有价值 - 你没有做任何重置值
这应该有效 通过调用RaisePropertyChanged(“Number”);如果!IsTextAllowed(value)
,它应该重置if (integers == value) return;
if (IsTextAllowed(value)) { integers = value; }
RaisePropertyChanged("Number");