控制模板中的ValidationRules

S R*_*sam 5 validation wpf validationrules

我有控制权继承自文本框

public class MyTextBox : TextBox
Run Code Online (Sandbox Code Playgroud)

这有一种风格

<Style TargetType="{x:Type Controls:MyTextBox}">
Run Code Online (Sandbox Code Playgroud)

塞特犬之一是

<Setter Property="Template">
Run Code Online (Sandbox Code Playgroud)

我希望能够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>
Run Code Online (Sandbox Code Playgroud)

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

Mer*_*ham 1

我不确定是否可以完全按照您的意愿去做。您可能可以通过属性设置器中的很多技巧来实现这一点(我不会依赖于此,因为它会涉及修改绑定,根据定义,绑定是动态的),或者使用隐藏代码/自定义控件。

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

MVVM - 验证

这样做将使您能够使用标准的 OO 组合技术,这样您就可以避免重复:)