Wpf 如何实现文本框的绑定验证?

Wpf 如何实现文本框的绑定验证?,wpf,Wpf,如何实现文本框的绑定验证 <TextBox Name="textBox1" Width="50" FontSize="15" Validation.ErrorTemplate="{StaticResource validationTemplate}" Style="{StaticResource textBoxInError}" Grid.Row="1" Grid.Column="1" Margin="2"> <TextBox.Text&g

如何实现文本框的绑定验证

<TextBox Name="textBox1" Width="50" FontSize="15"
     Validation.ErrorTemplate="{StaticResource validationTemplate}"
     Style="{StaticResource textBoxInError}"
     Grid.Row="1" Grid.Column="1" Margin="2">
    <TextBox.Text>
        <Binding Path="Age" Source="{StaticResource ods}"
         UpdateSourceTrigger="PropertyChanged" >
            <Binding.ValidationRules>
          // What should I write here?       
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

//我应该在这里写什么?

我应该在验证规则中写什么?

以下示例显示了AgrangeRule的实现,它继承自ValidationRule并重写Validate方法。对该值调用Int32.Parse()方法以确保它不包含任何无效字符。Validate方法返回ValidationResult,该结果根据解析期间是否捕获异常以及年龄值是否超出上下限来指示该值是否有效

public class AgeRangeRule : ValidationRule
{
    private int _min;
    private int _max;

    public AgeRangeRule()
    {
    }

    public int Min
    {
        get { return _min; }
        set { _min = value; }
    }

    public int Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = Int32.Parse((String)value);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, "Illegal characters or " + e.Message);
        }

        if ((age < Min) || (age > Max))
        {
            return new ValidationResult(false,
              "Please enter an age in the range: " + Min + " - " + Max + ".");
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }
}
public类AgeRangeRule:ValidationRule
{
私人互联网;;
私人国际最大值;
公共规则()
{
}
公共int Min
{
获取{return\u min;}
设置{u min=value;}
}
公共整数最大值
{
获取{return\u max;}
设置{u max=value;}
}
公共覆盖验证结果验证(对象值,CultureInfo CultureInfo)
{
int年龄=0;
尝试
{
如果(((字符串)值).Length>0)
age=Int32.Parse((字符串)值);
}
捕获(例外e)
{
返回新的ValidationResult(false,“非法字符”或“+e.Message”);
}
如果((年龄<最小值)| |(年龄>最大值))
{
返回新的ValidationResult(false,
请输入范围为“+Min+”-“+Max+”的年龄;
}
其他的
{
返回新的ValidationResult(true,null);
}
}
}

要扩展Cornel的答案,以下是与他的示例代码一起使用的相关XAML:

<TextBox Name="textBox1" Width="50" FontSize="15"
     Validation.ErrorTemplate="{StaticResource validationTemplate}"
     Style="{StaticResource textBoxInError}"
     Grid.Row="1" Grid.Column="1" Margin="2"> <TextBox.Text>
<Binding Path="Age" Source="{StaticResource ods}"
         UpdateSourceTrigger="PropertyChanged" >
  <Binding.ValidationRules>
    <c:AgeRangeRule Min="21" Max="130"/>
  </Binding.ValidationRules>
</Binding></TextBox.Text></TextBox>

总之,创建自定义验证类,在XAML代码中引用它,然后用初始化的必要属性实现它