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

时间:2018-08-24 14:17:37

标签: c# wpf xaml datepicker material-design-in-xaml

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

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

这些是我的DatePickers

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

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

1 个答案:

答案 0 :(得分:1)

在您的视图模型中实现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文章。