验证规则

本文关键字:规则 验证 | 更新日期: 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;
        }
    }
}