【问题标题】:End Date cannot be less then Start Date (WPFToolkit DatePicker)结束日期不能小于开始日期 (WPFToolkit DatePicker)
【发布时间】:2011-08-23 19:27:45
【问题描述】:

我正在将 WPFToolkit 用于 MVVM WPF 应用程序,并尝试将结束日期的中断日期设置为基于开始日期。

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

我收到错误消息,指出“End”不能有绑定

我该怎么做?

【问题讨论】:

    标签: wpf mvvm wpftoolkit


    【解决方案1】:

    如果你想要这种行为,我认为你需要构建自己的DatePicker,因为它看起来像工具包的End 属性不是DependencyProperty,所以End 属性不能指向绑定

    我过去有一个similar situation,我不希望StartDate 出现在EndDate 之后,我最终使用了验证错误,如果出现这种情况,它会在日期字段周围放置一个红色边框无效。

    【讨论】:

      【解决方案2】:

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

      为了获得这个功能,我使用了 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>
      

      【讨论】:

        猜你喜欢
        • 2016-11-03
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 1970-01-01
        • 2016-07-03
        相关资源
        最近更新 更多