C# 如何使用数据注释为WPF中的文本框创建输入验证?
我想在文本框中输入空值时为用户显示输入验证,是否有一种简单的方法可以使用数据注释为WPF执行此操作? 我是WPF和C的新手,如果有人能为我解释一下,我会非常感激。 我想要这样或类似的东西: 您必须使用如下错误模板:C# 如何使用数据注释为WPF中的文本框创建输入验证?,c#,wpf,xaml,C#,Wpf,Xaml,我想在文本框中输入空值时为用户显示输入验证,是否有一种简单的方法可以使用数据注释为WPF执行此操作? 我是WPF和C的新手,如果有人能为我解释一下,我会非常感激。 我想要这样或类似的东西: 您必须使用如下错误模板: <TextBox...> <Validation.ErrorTemplate> <ControlTemplate> <StackPanel> <!--
<TextBox...>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel>
<!-- Placeholder for the TextBox itself -->
<AdornedElementPlaceholder x:Name="textBox"/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
您必须使用如下所示的ErrorTemplate:
<TextBox...>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel>
<!-- Placeholder for the TextBox itself -->
<AdornedElementPlaceholder x:Name="textBox"/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
在绑定上使用a可以获得您想要的效果,您可以在XAML中声明性地指定它们,并且可以根据需要自定义和复杂它们:
<TextBox x:Name="FilePathTextBox" Width="350" Margin="5,0,0,0">
<TextBox.Text>
<Binding Path="FilePath" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<this:FilePathValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
将产生以下结果:
引用我的博客文章在绑定上使用可以获得您想要的效果,您可以在XAML中声明性地指定它们,并且可以根据需要自定义和复杂它们:
<TextBox x:Name="FilePathTextBox" Width="350" Margin="5,0,0,0">
<TextBox.Text>
<Binding Path="FilePath" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<this:FilePathValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
将产生以下结果:
参考我的博客帖子除了这里所有其他正确答案之外,除了ValidationRule之外,我建议您使用IDataError界面
使用该接口,您可以更轻松地匹配您在标题中提到的DataAnnotation的使用
演示模型:
我开发了这个,因为我讨厌如何使用ValidationRules。
此外,ValidationRules只是输入验证。这意味着,如果您的数据已损坏,您将永远不会注意到除了这里的所有其他正确答案之外,除了ValidationRule之外,我建议您使用IDataError接口
使用该接口,您可以更轻松地匹配您在标题中提到的DataAnnotation的使用
演示模型:
我开发了这个,因为我讨厌如何使用ValidationRules。
此外,ValidationRules只是输入验证。这意味着,如果您的数据已损坏,您将永远不会注意到这是一篇很好的文章:请展示您尝试过的内容,但是它只在文本框周围显示一条红线,没有任何注释。第二条注释使用try-and-catch,速度非常慢。还有其他方法吗?@LittleProgrammer看到你问题的第一条注释中的文章这是一篇很好的文章:请展示,你已经尝试过的内容。我尝试过这样的方法:第一条注释,但是它只在文本框周围显示一条红线,没有任何注释。第二条注释使用try-and-catch,速度非常慢。还有其他方法吗?@LittleProgrammer查看问题第一条注释中的文章我应该添加什么后面的C代码呢?@LittleProgrammer查看链接plz什么后面的C代码呢我应该加进去吗?@LittleProgrammer看到链接了吗
public MainWindow() {
InitializeComponent();
this.Ponys = new List<Pony>();
this.Ponys.Add(new Pony() { Color = Brushes.HotPink });
this.Ponys.Add(new Pony() { Id = 9, Name = "Not so fluffy", Color = Brushes.Chocolate });
this.DataContext = this;
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class Numeric : ValidationAttribute {
protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
if (value == null) {
return ValidationResult.Success;
}
double result;
var isNumeric = double.TryParse(value.ToString(), out result);
return !isNumeric ? new ValidationResult(this.ErrorMessage) : ValidationResult.Success;
}
}