我遇到了将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的基本规则吗?
或者,有没有办法可以使用样式应用此验证规则?我更愿意,说实话。
谢谢, 中号
答案 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());
}
}