2011-08-23 206 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> 
相關問題