我在wpf中有一个日期选择器,我必须禁用过去的日期。 我正在使用MVVM模式。 有可能吗?
你是怎么做到的?
答案 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)
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;
}
}
}