如何在两个日期选择器之间使用验证?

How to use a validation between two datepicker?

假设我有两个 DatePicker,我希望第一个 DatePicker 日期必须小于第二个 DatePicker。第二个 DatePicker 的日期必须比第一个大。

如果第一个 DatePicker 的日期大于第二个,则日期选择器上应该会出现验证错误。

这些是我的 DatePickers:

<DatePicker x:Name="StartPeriod"
            SelectedDate="{Binding PeriodStartDate}">
</DatePicker>

<DatePicker x:Name="EndPeriod"
            SelectedDate="{Binding PeriodEndDate}">
</DatePicker>

在您的视图模型中实现 INotifyDataErrorInfo 接口:

public class ViewModel : INotifyDataErrorInfo
{
    private readonly Dictionary<string, string> _validationErrors = new Dictionary<string, string>();

    private DateTime _periodStartDate;
    public DateTime PeriodStartDate
    {
        get { return _periodStartDate; }
        set { _periodStartDate = value; Validate(); }
    }

    private DateTime _periodEndDate;
    public DateTime PeriodEndDate
    {
        get { return _periodEndDate; }
        set { _periodEndDate = value; Validate(); }
    }

    private void Validate()
    {
        if (_periodStartDate > _periodEndDate)
            _validationErrors.Add(nameof(PeriodStartDate), $"{nameof(PeriodEndDate)} cannot be smaller than {nameof(PeriodStartDate)}");
        else
            _validationErrors.Clear();

        RaiseErrorsChanged(nameof(PeriodStartDate));
    }

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
    private void RaiseErrorsChanged(string propertyName) =>
        ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));

    public bool HasErrors => _validationErrors.Count > 0;

    public IEnumerable GetErrors(string propertyName)
    {
        string error;
        if (_validationErrors.TryGetValue(propertyName, out error))
            return new string[1] { error };

        return null;
    }
}

更多信息请参考this文章。