我有控制权继承自文本框
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>
答案 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验证”时发现的第一个:
执行此操作将允许您使用标准OO合成技术,因此您可以avoid repeating yourself:)