두 개의 날짜 필드가 서로 조정되어야하는 동일한 작업을했습니다. 또한 날짜 유효성 검사 (예 : 유효성 검사를 시행하지 않을시기)와 함께 구현해야하는 다른 비즈니스 논리도있었습니다.
이 기능을 사용하려면 WPF DataValidation 규칙을 사용했습니다.
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>