У меня была такая же задача, где два поля даты должны были координироваться друг с другом. У меня также была другая бизнес-логика, которая должна была быть реализована вместе с проверкой даты (например, когда и когда не проводить проверку).
Чтобы получить эту функциональность, я использовал правила проверки данных WPF.
public class ValidateDate : ValidationRule
{
public DateTime EndDate { get; set; }
/// <summary>
/// Validates date is valid
/// </summary>
/// <param name="value"></param>
/// <param name="cultureInfo"></param>
/// <returns></returns>
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
// Return if null
if (value == null)
{
return new ValidationResult(true, null);
}
DateTime t;
if (!DateTime.TryParse(value.ToString(), out t))
return new ValidationResult(false, null);
if(t == null)
{
return new ValidationResult(true, null);
}
if (t.Date < EndDate )
{
string message = "Invalid Date";
return new ValidationResult(false, message);
}
else
{
return new ValidationResult(true, null);
}
}
Вот привязки, применяемые в коде позади.
System.Windows.Data.Binding b1 = BindingOperations.GetBinding(dpMyDate,
DatePicker.SelectedDateProperty);
b1.ValidationRules.Clear(); // Clear as I reuse them
ValidateDate vd = new ValidateDate();
vd.EndDate = datePickerEndDate.SelectedDate;
b1.ValidationRules.Add(vd);
Используя этот метод, вы можете запретить пользователям выбирать недопустимую дату и устанавливать стиль для ваших палитр, когда они недействительны, как показано ниже.
<Style TargetType="{x:Type DatePicker}">
<Setter Property="Width" Value="110"/>
<Setter Property="Margin" Value="5" />
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Text" Value="No Date" />
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Foreground" Value="Red" />
<Setter
Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>