2011-08-23 171 views
0

我正在为MVVM WPF应用程序使用WPFToolkit,并试图将结束日期的停电日期设置为基于开始日期。结束日期不能小于开始日期(WPFToolkit DatePicker)

例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> 

我得到错误,指出 “结束” 不能有绑定

我该怎么办呢?

回答

1

我认为你需要建立自己的DatePicker如果您希望此行为,因为它看起来像工具箱一个的End属性不是DependencyProperty,所以End财产不能指向绑定

我已经在过去我有一个similar situation,我不希望StartDate跟在EndDate之后,而我刚刚结束了使用验证错误,如果无效,它会在日期字段周围放置一个红色边框。

0

我有同样的任务,其中两个日期字段必须相互协调。我还有其他业务逻辑必须与日期验证一起实施(例如何时和何时不执行验证)。

为了获得此功能,我使用了WPF DataValidation Rules。

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> 
相关问题