Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确地将正则表达式应用于文本框,以便无法使用MVVM WPF键入不需要的字符_C#_Regex_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 如何正确地将正则表达式应用于文本框,以便无法使用MVVM WPF键入不需要的字符

C# 如何正确地将正则表达式应用于文本框,以便无法使用MVVM WPF键入不需要的字符,c#,regex,wpf,xaml,mvvm,C#,Regex,Wpf,Xaml,Mvvm,当通过WPF使用正则表达式来限制文本框中可以键入的字符时,我很难获得期望的结果。目前我有一个相当标准的Xaml文本框 <TextBox x:Name="txtRegistration" Text="{Binding Registration,UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding RegistrationIsEnabled}" Horizon

当通过WPF使用正则表达式来限制文本框中可以键入的字符时,我很难获得期望的结果。目前我有一个相当标准的Xaml文本框

  <TextBox x:Name="txtRegistration" 
           Text="{Binding Registration,UpdateSourceTrigger=PropertyChanged}" 
           IsEnabled="{Binding RegistrationIsEnabled}"
           HorizontalAlignment="Stretch"
           HorizontalContentAlignment="Left"
           Height="Auto"
           Width="Auto"
           VerticalAlignment="Center"/>
我应该指出,我的viewmodel实现了MVVMLight版本的ViewModelBase

我期待在这里发生的事情:

  • 如果用户键入一个数字字符,
    regex.IsMatch
    函数将不会找到冲突字符,因此跳转到else语句,在该语句中,字段将以正常值更新并传递回文本框

  • 如果用户键入非数字字符,
    regex.IsMatch
    函数将发现冲突字符,因此不会用新值更新字段。文本框将使用在用户尝试输入非数字字符之前为属性保留的值进行更新,从而有效地阻止他们输入非数字字符

  • 当我在setter上设置断点时,该过程似乎像我上面描述的那样工作,除了文本框中显示的实际值没有反映这一点(例如,在文本框中键入“123abc”将显示“123abc”,而不仅仅是“123”)

    我不完全确定问题出在哪里,因此任何建议都将不胜感激

    另外,我应该指出,我不是在寻找在Xaml中进行验证的解决方案,因为我需要在视图模型中进行验证,以便根据不同客户端的自定义设置为正则表达式提供不同的选项


    谢谢

    如果指定一个临时字符串来保存原始值,然后将其设置为_registration,然后以个人方式激活inotifypropertychangedp,我会在ViewModel中使用Implemente IDataErrorInfo。您可以测试任何用户客户端设置等,然后您可以向用户提供反馈,说明其输入无效的原因等。尝试类似AttachedProperty的属性并将AttachedProperty值绑定到模型中的字符串正则表达式怎么样?这将阻止字符输入、动态正则表达式值,并且对于出现的任何其他情况都是可重用的。如何分配一个临时字符串来保存原始值,然后将其设置为_registration,然后以个人方式触发InotifyPropertyChangedP,我将在ViewModel中使用implement IDataErrorInfo。您可以测试任何用户客户端设置等,然后您可以向用户提供反馈,说明其输入无效的原因等。尝试类似AttachedProperty的属性并将AttachedProperty值绑定到模型中的字符串正则表达式怎么样?这将防止字符输入、动态正则表达式值,并且对于出现的任何其他情况都是可重用的。
     private string _registration; 
    
     public string Registration
     {
            get { return _registration; }
            set
            {
                if (System.Text.RegularExpressions.Regex.IsMatch(value, "[^0-9]", System.Text.RegularExpressions.RegexOptions.Singleline))
                {
    
                }
                else
                {
                    _registration = value;
                }
    
                RaisePropertyChanged("Registration");
            }
        }