WPF-MVVM文本框限制为特定字符

Rob*_* J. 2 c# wpf mvvm

我试图使文本框仅接受特定字符。

我的文本框绑定到以下内容:

    private string _CompanyID;
    public string CompanyID
    {
        get { return _CompanyID; }
        set
        {
            _CompanyID = UniversalHelpers.sReturnCorrectColumnName(value);
            OnPropertyChanged("CompanyID");
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是被调用的函数:

    public static string sReturnCorrectColumnName(string sInput)
    {
        if(!string.IsNullOrWhiteSpace(sInput))
            return Regex.Replace(sInput, @"[^a-zA-Z]", string.Empty).ToUpper();
        else
            return sInput;
    }
Run Code Online (Sandbox Code Playgroud)

(我只允许使用AZ&AZ,没有其他内容)。

最后,我的TextBox看起来像这样:

<TextBox Text="{Binding ExcelBindings.CompanyID, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
Run Code Online (Sandbox Code Playgroud)

我不明白的是,即使我的“模式”设置为“双向”,该用户仍然可以写他想要的任何内容。

我究竟做错了什么?

pok*_*oke 6

您应该在此处使用自定义UI元素,以使用“经典”解决方案(如更改侦听器)在视图侧限制输入。

例如,您可以创建一个TextBox覆盖该OnPreviewTextInput方法的简单子类型。在那里,您可以决定何时应进行某些输入或何时要阻止输入。

例如,这是一个自定义TextBox,仅接受ASCII字母中的字符:

public class AlphabetTextBox : TextBox
{
    private static readonly Regex regex = new Regex("^[a-zA-Z]+$");

    protected override void OnPreviewTextInput(TextCompositionEventArgs e)
    {
        if (!regex.IsMatch(e.Text))
            e.Handled = true;
        base.OnPreviewTextInput(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以将正则表达式设为文本框的属性,并允许人们从XAML进行设置。这样,您将获得一个非常可重用的组件,可以将其用于各种应用程序。