在datepicker wpf中禁用过去的日期是可能的

时间:2011-02-03 07:08:13

标签: wpf

我在wpf中有一个日期选择器,我必须禁用过去的日期。 我正在使用MVVM模式。 有可能吗?

你是怎么做到的?

5 个答案:

答案 0 :(得分:7)

您可以使用DisplayDateStart的{​​{1}}和DisplayDateEnd属性。它们是依赖项属性,因此您可以使用MVVM通过DatePicker提供它们。这是文档:

答案 1 :(得分:3)

除了Rick的答案之外,DisplayDateStart和DisplayDateEnd仅影响日历,它不会阻止用户输入超出此范围的有效日期。

为此,您可以在ViewModel的bound属性的setter中抛出异常,或者如果您使用的是IDataErrorInfo,则通过此[string columnName]返回验证错误消息

ExceptionValidationRule:

<Binding Path="SelectedDate" UpdateSourceTrigger="PropertyChanged"> 
    <Binding.ValidationRules>
      <ExceptionValidationRule />
    </Binding.ValidationRules>
  </Binding>

答案 2 :(得分:1)

您必须使用今天的日期

设置DisplayDateStart属性
<DatePicker Name="dt_StartDateFrom" DisplayDateStart="{x:Static sys:DateTime.Today}">
</DatePicker>

确保已设置

  

的xmlns:SYS =&#34; CLR-命名空间:系统;装配= mscorlib程序&#34;

您的<UserControl>代码中的

可以使用sys:参数

P.S。要禁用将来的日期,您可以使用DisplayDateEnd属性

答案 3 :(得分:0)

如果您的禁用日期范围涉及您希望保留在xaml中的常量,则

This可能是更简洁的解决方案。

答案 4 :(得分:0)

如果您使用的是MVVM,我们可以使用自定义属性进行验证。

public Class MyModel : INotifyPropertyChanged{

   private DateTime _MyDate;
   [FutureDateValidation(ErrorMessage="My Date should not be greater than current Date")]
   public DateTime Mydate{
       get{return _MyDate;}
       set{
          _Mydate=value;
       }
   }


}

FutureDateValidation的实现如下所示

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    class FutureDateValidationAttribute : ValidationAttribute
    {

        protected override ValidationResult IsValid(object value,ValidationContext validationContext)
        {
            ErrorMessage = ErrorMessageString;
            DateTime inputDateTime = (DateTime)value;
            if (inputDateTime != null)
            {
                if (inputDateTime > DateTime.Now)
                {
                    return new ValidationResult(ErrorMessage);
                }
                else {
                    return null;
                }

            }
            else {
                return null;
            }
        }
    }