我正在尝试使文本框只接受特定字符。
我的文本框绑定到以下内容:
private string _CompanyID;
public string CompanyID
{
get { return _CompanyID; }
set
{
_CompanyID = UniversalHelpers.sReturnCorrectColumnName(value);
OnPropertyChanged("CompanyID");
}
}
这是一个被调用的函数:
public static string sReturnCorrectColumnName(string sInput)
{
if(!string.IsNullOrWhiteSpace(sInput))
return Regex.Replace(sInput, @"[^a-zA-Z]", string.Empty).ToUpper();
else
return sInput;
}
(我只允许a-z和A-Z,没有其他的)。
最后,我的TextBox看起来像这样:
<TextBox Text="{Binding ExcelBindings.CompanyID, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
我不明白的是,用户仍然可以写任何他想写的东西,即使我的模式设置为双向。
我做错了什么?
4条答案
按热度按时间oewdyzsn1#
您应该在那里使用一个自定义UI元素,它使用“经典”解决方案(如更改侦听器)来限制视图端的输入。
例如,您可以只创建一个简单的
TextBox
子类型,它覆盖OnPreviewTextInput
方法。在那里,您可以决定何时应该通过某些输入,或者何时要阻止它。例如,这是一个自定义TextBox,它只接受ASCII字母表中的字符:
当然,您也可以将正则表达式作为文本框的属性,并允许人们从XAML设置它。这样,您将获得一个非常可重用的组件,您可以将其用于各种应用程序。
k3bvogb12#
我使用PreviewtextInput事件来实现这一点。我有一个用于多个TextBox的通用事件,它从配置表中获取正则表达式,但在本例中我对正则表达式进行了硬编码。
dwbf0jvd3#
问题是,人类按顺序输入数字,傻瓜。
要输入“0.1”,一个合法的字符串,你必须输入“0.”,这会失败。此外,重新接受来自@poke的答案(这是伟大的),e.Text值是对文本框(击键)的 * 更改 *。
必须将此更改添加到当前文本框字符串中,然后验证串联的候选字符串,并查看其是否有效。人类也是狡猾的,所以他们会从剪贴板粘贴来绕过限制。
使用文本框,您将永远无法阻止所有垃圾,因为在某些时候,用户将不得不通过垃圾来获得有效的字符串。
因此,您可以使用e.Text阻止非法字符输入,或允许连续步骤失败。但是你仍然需要检查最后的字符串的有效性。
下面是一个文本框的例子,它允许用户输入一个最多8位的十进制值,但他们仍然可以通过从剪贴板粘贴来欺骗这一点。
wljmcqd84#