Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 如何使用数据注释为WPF中的文本框创建输入验证?_C#_Wpf_Xaml - Fatal编程技术网

C# 如何使用数据注释为WPF中的文本框创建输入验证?

C# 如何使用数据注释为WPF中的文本框创建输入验证?,c#,wpf,xaml,C#,Wpf,Xaml,我想在文本框中输入空值时为用户显示输入验证,是否有一种简单的方法可以使用数据注释为WPF执行此操作? 我是WPF和C的新手,如果有人能为我解释一下,我会非常感激。 我想要这样或类似的东西: 您必须使用如下错误模板: <TextBox...> <Validation.ErrorTemplate> <ControlTemplate> <StackPanel> <!--

我想在文本框中输入空值时为用户显示输入验证,是否有一种简单的方法可以使用数据注释为WPF执行此操作? 我是WPF和C的新手,如果有人能为我解释一下,我会非常感激。 我想要这样或类似的东西:

您必须使用如下错误模板:

<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;
    }
  }