我有两个日期选择器绑定到继承自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在这种情况下所做的,而不是在出现错误时显示警报,只是通过将endDate
的MinimumDateProperty
绑定到uCoSafe.StartDate
来防止用户犯这样的错误。这可能最终会带来更好的用户体验,仍然是IMHO。