我在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();
}
答案 0 :(得分:0)
解决了我的问题,验证器按预期工作。问题在于我的约束力。我试图在后面的代码中设置每个文本框的文本,而不使用绑定路径。从txtTextbox.Text = "123"
切换到以下内容后,一切都准备就绪并开始正常工作。
private void fillInventoryInformation(Inventory i)
{
DataContext = i;
}