Xamarin.Forms 2 日期选取器 不允许结束日期早于开始日期



我有两个日期选择器绑定到继承自INotifyPropertyChanged的对象-这是DateTime属性的代码

private DateTime _startDate;
public DateTime StartDate
{
    get { return _startDate; }
    set
    {
        if (DateTime.Compare(value, _startDate) == 0)
        {
            return;
        }
        _startDate = value;
        OnPropertyChanged();
    }
}
//public DateTime StartDate { get; set; }
private DateTime _endDate;
public DateTime EndDate
{
    get { return _endDate; }
    set
    {
        if (DateTime.Compare(value, _endDate) == 0)
        {
            return;
        }
        _endDate = value;
        OnPropertyChanged();
    }
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

在表格页上我有这个

        DatePicker startDate = new DatePicker
        {
            BindingContext = uCoSafe,
            Format = "D"
        };
        startDate.SetBinding(DatePicker.DateProperty, new Binding("StartDate", BindingMode.OneWayToSource));
        startDate.PropertyChanged +=(sender, e) =>
            {
                 uCoSafe.EndDate = uCoSafe.StartDate.AddDays(1);
            };
        MyCoLabel endDateLbl = new MyCoLabel(1, "End Date");
        DatePicker endDate = new DatePicker
        {
            BindingContext = uCoSafe,
            Format = "D"
        };
        endDate.SetBinding(DatePicker.DateProperty, new Binding("StartDate", BindingMode.TwoWay));

这一切都很好。如果我更改开始日期,则结束日期将更新。

我也想要它,如果结束日期是手动更改的,那么它不能设置在开始日期之前。

我试过这个

endDate.PropertyChanged +=  (sender, e) =>
{
    if (uCoSafe.EndDate.Date <= uCoSafe.StartDate.Date)
    {
        uCoSafe.EndDate = uCoSafe.StartDate.AddDays(1);
        DisplayAlert("End Date Error", "End date cannot be earlier than the start date, please try again", "OK");
     }
}

但它只在startDate更改时触发(当我不想要消息时),而不是在手动更改endDate的日期选择器时触发。

任何建议都非常感谢

您对endDate的绑定看起来是错误的。您写道:

endDate.SetBinding(DatePicker.DateProperty, new Binding("StartDate", BindingMode.TwoWay));

你的意思可能是:

endDate.SetBinding(DatePicker.DateProperty, new Binding("EndDate", BindingMode.TwoWay));
                                                        ^^^^^^^^^

这应该会让你回到正轨。

现在,I在这种情况下所做的,而不是在出现错误时显示警报,只是通过将endDateMinimumDateProperty绑定到uCoSafe.StartDate来防止用户犯这样的错误。这可能最终会带来更好的用户体验,仍然是IMHO。

最新更新