控制模板中的ValidationRules

时间:2011-09-05 09:50:30

标签: wpf validation validationrules

我有控制权继承自文本框

public class MyTextBox : TextBox

这有一种风格

<Style TargetType="{x:Type Controls:MyTextBox}">

其中一个Setters是

<Setter Property="Template">

我希望能够将Binding.ValidationRules设置为模板中的某些内容,从而影响此类文本框的所有实例。 因此,我可以制作文本框,例如Times,Dates,Numerics,post / zip code ..或者我想要的任何内容,

我不想每次创建文本框时都设置验证规则。我只是想说我想要一个NumericTextBox并让它以模板中设置的方式进行验证。

这可能吗?

到目前为止,我所看到的是在控件的每个实例上设置的ValidationRules,例如

<TextBox x:Name="txtEMail" Template={StaticResource TextBoxErrorTemplate}>
<TextBox.Text>
    <Binding Path="EMail" UpdateSourceTrigger="PropertyChanged" >
        <Binding.ValidationRules>
            <local:RegexValidationRule Pattern="{StaticResource emailRegex}"/>
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

(来自http://www.wpftutorial.net/DataValidation.html

2 个答案:

答案 0 :(得分:4)

如您所见,验证规则与绑定一起设置。我遇到了同样的问题,我的工作解决方案是做这样的事情:

    public MyTextBox()
    {            
        this.Loaded += new RoutedEventHandler(MyTextBox_Loaded);
    }

    void MyTextBox_Loaded(object sender, RoutedEventArgs e)
    {
        var binding = BindingOperations.GetBinding(this, TextBox.ValueProperty);
        binding.ValidationRules.Add(new MyValidationRule());
    }

这里的问题是确保在我们添加验证规则之前设置了绑定,因此使用了Loaded,但我不确定这是否适用于每个场景。

答案 1 :(得分:1)

我不确定是否可以完全按照自己的意愿行事。您可能能够在属性设置器中使用大量技巧(我不会依赖于此,因为它将涉及修改绑定,根据定义是动态的),或者使用代码隐藏/自定义控件。

相反,我建议您将验证推送到ViewModel,可能使用IDataErrorInfo。那里有很多文章。这是我刚刚搜索“MVVM验证”时发现的第一个:

MVVM - Validation

执行此操作将允许您使用标准OO合成技术,因此您可以avoid repeating yourself:)