验证规则
本文关键字:规则 验证 | 更新日期: 2023-09-27 18:20:42
在wpf视图中,我有3个文本框,它们实现了如下自定义验证规则:
<TextBox HorizontalAlignment="Left"
Height="30"
Grid.Row="2"
Grid.Column="1"
TextWrapping="Wrap"
VerticalAlignment="Top"
Width="150"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
<TextBox.Text>
<Binding Path="Model.Age"
Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnExceptions="True"
ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<validation:DataTypeValidationRules DataTypeRule="Required"
ErrorMessage="Required field" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
我的问题是:如果我直接在文本框中更改文本,则验证有效,如果文本框没有值,我可以看到我的模板,但如果我在视图中什么都不做,并单击我的保存按钮(该按钮具有绑定到我的ViewModel的命令),则验证无效,因为我认为没有引发OnPropertyChange事件,因此,我需要再次检查viewmodel中的值是否为空,我不想这样做。
注意:我使用的是MVVM模式
对不起我的英语,非常感谢你的回复。
我能想到这个问题可能发生的唯一方法是从视图模型而不是从UI设置文本,在这种情况下,这真的是一个问题,因为不会重新评估验证规则。
为了解决这个问题,你可以实现IDataErrorInfo
接口,或者更好的是,实现INotifyDataErrorInfo
接口(如果你的目标是.NET 4.5)。这不仅可以解决你的问题,而且是执行验证的MVVM方式(你目前正在XAML中定义验证逻辑,这不好)。完成此操作后,还可以从XAML中删除绑定规则。
实施示例:
public class ViewModel : IDataErrorInfo
{
public string Error
{
get { return null; }
}
public string this[string propertyName]
{
get
{
if (propertyName == "Age")
{
if (Age < 18)
{
return "Age must be at least 18.";
}
}
return null;
}
}
}