5

我有从文本框继承的控制权

public class MyTextBox : TextBox

这个有风格

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

二传手之一是

<Setter Property="Template">

我希望能够将 设置为Binding.ValidationRules模板中的某些内容,从而影响此类文本框的所有实例。因此,我可以为时间、日期、数字、邮政/邮政编码或任何我想要的东西制作文本框,

我不想每次创建文本框时都必须设置验证规则。我只想说我想要一个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

4

2 回答 2

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());
    }

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

于 2011-09-05T16:10:30.987 回答
1

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

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

MVVM - 验证

这样做将允许您使用标准的 OO 组合技术,因此您可以避免重复自己:)

于 2011-09-06T03:53:07.643 回答