结束日期不能小于开始日期(WPFToolkit DatePicker)

时间:2011-08-23 19:27:46

标签: wpf mvvm wpftoolkit

我正在将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>

我收到错误消息,指出“结束”无法拥有绑定

我该怎么做?

2 个答案:

答案 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>