WPF / XAML:在代码与标记中应用时,ExceptionValidationRule有什么不同?

时间:2010-12-16 21:57:02

标签: wpf xaml

我遇到了将ExceptionValidationRule应用于WPF中表单上的许多文本框的需要。我可以使用标记执行此操作并获得所需的结果(输入无效值时文本框会显示红色轮廓)但仅当我在标记中提供规则时才会显示:

<TextBox x:Name="Name" Width="150" >
    <TextBox.Text>
         <Binding Path="Name" Mode="TwoWay"  UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
              <Binding.ValidationRules>
                   <ExceptionValidationRule />
              </Binding.ValidationRules>
         </Binding>
    </TextBox.Text>
 </TextBox>

但是当我使用代码应用值时:

Name.GetBindingExpression(TextBox.TextProperty).ParentBinding.ValidationRules.Add(new ExceptionValidationRule());

我没有得到预期的结果。在InitalizeComponent()调用之后,此代码应用于userControl的构造函数中。用户控件将文本框“Name”作为子控件。

我已经完成了,我可以看到,当使用两者时,两个验证规则放在ValidationRules集合中,但是当我只使用代码版本时,我没有得到所需的红色轮廓结果输入无效值时的文本框。

我只是误解了WPF的基本规则吗?

或者,有没有办法可以使用样式应用此验证规则?我更愿意,说实话。

谢谢, 中号

1 个答案:

答案 0 :(得分:2)

使用后无法更改绑定,并且显然也适用于ValidationRules。你可以在代码中创建一个新的Binding,但这可能不是你想要的。

Binding binding = new Binding("Name");
binding.Mode = BindingMode.TwoWay;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
binding.NotifyOnValidationError = true;
binding.ValidationRules.Add(new ExceptionValidationRule());
nameTextBox.SetBinding(TextBox.TextProperty, binding);

由于Binding或ValidationRule不是从FrameworkElement派生的,因此Style不起作用。在你的情况下我会做的是一个子类Binding,你可以在其中添加你需要的所有东西。像这样的东西

<TextBox x:Name="Name" Width="150" >    
    <TextBox.Text>    
        <local:ExBinding Path="Name"
                         Mode="TwoWay"
                         UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
</TextBox>

ExBinding,添加ValidationRule等。

public class ExBinding : Binding
{
    public ExBinding()
        : base()
    {
        NotifyOnValidationError = true;
        ValidationRules.Add(new ExceptionValidationRule());
    }
}