如何链接两个日期选择,以便其中一个日期不能大于或小于其他人的日期



我在WPF中编程,并且有一个接口,其中制造日期和到期日期是两个日期选择器。如何将到期日期日期选择器设置为只选择大于生产日期的日期?

不幸的是,WPF日期选择器没有最小日期属性,尽管它有DisplayDateStart依赖属性。在日期选择器控件的日历弹出部分中,此属性隐藏指定值之前的日期。

但是,用户仍然可以使用日期选择器的文本框部分输入任何到期日期。为了处理此问题,您需要验证两个日期选择器的SelectedDate属性。

我已经附上了同时做这两件事的代码(为了这个问题的目的,我假设你没有使用MVVM——如果你让我知道的话):

首先,在XAML中,过期日期选择器的DisplayDateStart依赖属性绑定到生产日期选择器的SelectedDate依赖属性(从而在过期日期选择器日历弹出窗口中隐藏无效日期)。由于您的要求是"仅大于生产日期",因此需要在生产日的第二天返回值转换器。

<StackPanel>
<StackPanel.Resources>
<yournamespace:NextDayConverter x:Key="NextDayConverter" />
</StackPanel.Resources>
<DatePicker x:Name="ManufacturingDatePicker"
SelectedDateChanged="OnSelectedDateChanged" />
<DatePicker x:Name="ExpiryDatePicker"
SelectedDateChanged="OnSelectedDateChanged"
DisplayDateStart="{Binding 
ElementName=ManufacturingDatePicker,
Path=SelectedDate,
Converter={StaticResource NextDayConverter}}" />
</StackPanel>

NextDayConverter的详细信息如下:

namespace YourNamespace
{
using System;
using System.Globalization;
using System.Windows.Data;
public sealed class NextDayConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
DateTime manufacturingDate = (DateTime)value;
DateTime minimumExpiryDate = manufacturingDate.AddDays(1);
return minimumExpiryDate;
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

其次,在代码背后,有一个处理程序用于处理两个日期选择器的SelectedDateChanged事件。如果用户输入了无效的有效期(即早于或等于生产日期),则此处的验证代码将有效期设置为生产日期。

private void OnSelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
if (ManufacturingDatePicker.SelectedDate.HasValue &&
ExpiryDatePicker.SelectedDate.HasValue &&
ExpiryDatePicker.SelectedDate <= ManufacturingDatePicker.SelectedDate)
{
ExpiryDatePicker.SelectedDate = ManufacturingDatePicker.SelectedDate.Value.AddDays(1);
}
}

我希望这能有所帮助。

最新更新