TextBox验证无法正常工作

时间:2018-07-12 16:58:52

标签: c# regex wpf

我在WPF的文本框中实现数字验证器时遇到麻烦。如果用户在文本框中输入 abc 之类的内容,则会弹出警告/错误消息。如果他们输入 1.99 ,那应该没问题。据我所知,目前正在发生的事情是没有触发验证。另一个问题是,在页面加载时,我将文本框的值设置为预定义值,但是当您看到页面加载时,文本框为空。因此,没有在文本框中看到类似 13.42 的内容,而是空白。但是,当我移除<TextBox.Text>部分时,该值就会出现。

这是我的正则表达式验证器类:

public class RegexValidation : ValidationRule
    {
        private string pattern;
        private Regex regex;

        public string Expression
        {
            get { return pattern; }
            set
            {
                pattern = value;
                regex = new Regex(pattern, RegexOptions.IgnoreCase);
            }
        }

        public RegexValidation() { }

        public override ValidationResult Validate(object value, CultureInfo ultureInfo)
        {
            if (value == null || !regex.Match(value.ToString()).Success)
            {
                return new ValidationResult(false, "The value is not a valid number");
            }
            else
            {
                return new ValidationResult(true, null);
            }
        }
    }

接着,这是我的页面资源:

<Page.Resources>
        <system:String x:Key="regexDouble">^\d+(\.\d{1,2})?$</system:String>
        <ControlTemplate x:Key="TextBoxErrorTemplate">
            <StackPanel>
                <StackPanel Orientation="Horizontal">                    
                    <AdornedElementPlaceholder x:Name="Holder"/>
                </StackPanel>
                <Label Foreground="Red" Content="{Binding ElementName=Holder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
            </StackPanel>
        </ControlTemplate>        
    </Page.Resources>  

最后,需要验证的文本框和如果文本框中没有数字的按钮将不起作用:

<TextBox Name="txtItemPrice" Grid.Column="12" Grid.ColumnSpan="2" Grid.Row="4" HorizontalAlignment="Stretch" VerticalAlignment="Center" IsEnabled="False" Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}">
            <TextBox.Text>
                <Binding Path="intPrice" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <classobjects:RegexValidation Expression="{StaticResource regexDouble}"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
<Button Name="btnSaveChanges" Content="Save Changes" Grid.Column="4" Grid.Row="11" HorizontalAlignment="Stretch" VerticalAlignment="Center" Visibility="Hidden" Click="btnSaveChanges_Click"/>

我尝试过的教程没有成功:

编辑:

我尝试了与设置文本不同的方式。我没有直接设置文本框文本,而是尝试将绑定路径属性与以下代码一起使用。但是,我仍然没有任何结果。

private string price;
public string intPrice
{
     get { return price; }
     set { price = value; }
}
private void fillInventoryInformation(Inventory i)
{
     //This method is called from the starter method on this page. 
     //Here I am setting the value of intPrice
     intPrice= (Convert.ToDouble(i.intPrice) / 100).ToString();  
     //This was how I was previously trying to set the value of the textbox  
     txtItemPrice.Text = (Convert.ToDouble(i.intPrice) / 100).ToString();    
}

1 个答案:

答案 0 :(得分:0)

解决了我的问题,验证器按预期工作。问题在于我的约束力。我试图在后面的代码中设置每个文本框的文本,而不使用绑定路径。从txtTextbox.Text = "123"切换到以下内容后,一切都准备就绪并开始正常工作。

private void fillInventoryInformation(Inventory i)
{
    DataContext = i;
}