我正在将WPFToolkit用于MVVM WPF应用程序,并尝试将结束日期的Blackout日期设置为基于开始日期。
示例1:
<toolkit:DatePicker SelectedDate="{Binding StartDate}"></toolkit:DatePicker>
示例2:
<toolkit:DatePicker SelectedDate="{Binding EndDate}">
<toolkit:DatePicker.BlackoutDates>
<toolkit:CalendarDateRange Start="1/1/2000" End="{Binding StartDate}" />
</toolkit:DatePicker.BlackoutDates>
</toolkit:DatePicker>
我收到错误消息,指出“结束”无法拥有绑定
我该怎么做?
答案 0 :(得分:1)
我认为如果你想要这种行为,你需要建立自己的DatePicker
,因为看起来工具箱的End
属性不是DependencyProperty
,所以{{1 } property不能指向Binding
过去我有一个similar situation我不希望End
来到StartDate
之后我最后使用了验证错误,这会产生一个红色日期字段周围的边框,如果它无效。
答案 1 :(得分:1)
我有同样的任务,两个日期字段必须相互协调。我还有其他必须与日期验证一起实现的业务逻辑(例如何时以及何时不执行验证)。
为了获得此功能,我使用了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>