如何为wpf文本框编写逗号分隔数字正则表达式验证

时间:2010-07-15 12:01:53

标签: c# wpf regex xaml multidatatrigger

我正在开发一个WPF (.NET 3.5)应用,我需要使用textbox验证regular expression以匹配空文本框或0214505145等文字或021450587902445。我使用的表达式是^(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)$

它几乎可以工作,我不会让我有空文本框。这是一些代码

<Window.Resources>
    <data:Message x:Key="message"/>
    <Style x:Key="validButton" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}" >
        <Setter Property="IsEnabled" Value="False"/>
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <!-- ......-->
                    <Condition Binding="{Binding ElementName=txtNumbers, Path=(Validation.HasError)}" Value="false"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="IsEnabled" Value="True" />
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>

<TextBox Height="23" Margin="-194.5,-88,-195.5,0" Name="txtNumbers" VerticalAlignment="Top" Style="{StaticResource txtboxerrors}">
                        <TextBox.Text>
                            <Binding Path="Numbers" Source="{StaticResource message}" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
                                <Binding.ValidationRules>
                                    <ExceptionValidationRule />
                                </Binding.ValidationRules>
                            </Binding>
                        </TextBox.Text>
 </TextBox>
<Button Height="23" Margin="0,0,-81,-189" Name="btnSendSMS" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="btnSubmit_Click" Style="{StaticResource validButton}">Submit</Button>

用于验证的类别在

之下
class Message :IDataErrorInfo
{
    //...
    private string numbers;



    public string this[string columnName]
    {
        get
        {
            string result = null;
            //.....
            if (columnName == "Numbers")
            {
//multicellRegex has the ^(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)$ expression                 if(!Util.ValidateRegexPatern(Properties.Resources.multicellRegex,this.numbers))
                {
                    result = "Number not in the correct format.try 020xx or 05xxx,026xx";
                }
            }


            return result;
        }
    }

    public string Error
    {
        get { return  null; }
    }

   //.....
        public string Numbers
        {
          get { return numbers; }
          set { numbers = value; }
        }


}

这很有效,但是除非我在txtNumbers文本框中输入一个或多个数字,否则提交按钮不会处于活动状态。我只想让它允许空文本框。 我该怎么做?感谢您的阅读

3 个答案:

答案 0 :(得分:2)

您应该将整个模式设为可选,而不是单独的部分,否则它会认为,02000是有效的条目。

由于每个号码都有特定长度,因此您无需使用*?进行匹配(<{1}})。

^((0[25]\d{3})(,0[25]\d{3})*)?$.

允许数字周围的空格是:

^\s*((0[25]\d{3})(\s*,\s*0[25]\d{3})*)?\s*$.

答案 1 :(得分:1)

正则表达式很好,可以做你想要的。也许你的文本框里面有一些杂散的空白?

尝试在开头和结尾封装杂散空白,无论如何都要强大:

^\s*(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)\s*$

答案 2 :(得分:0)

在您的视图模型下,只需在视图模型开始加载时设置Numbers =string.Empty,因此通过更改通知,您的逻辑应该应用,您将获得所需的效果。

干杯。