WPF DateTimePicker在验证后未设置日期

时间:2011-03-09 12:08:02

标签: wpf binding wpftoolkit

我正在尝试在日期时间选择器控件中验证所选日期,并将所选日期设置为今天的日期,如果选择的日期是> Datetime.Today。我面临的问题是我无法通过xaml设置datetimepicker控件的SelectedDate属性。我觉得绑定有问题,请帮忙吗?

以下是代码。请你告诉我我做错了什么?

  <Controls:DatePicker Height="20"
                                 Grid.Row="0"
                                 Grid.Column="0"
                                 Grid.ColumnSpan="2"
                                 x:Name="dateControl"
                                 IsTodayHighlighted="True"
                                 Margin="5,10,5,20"
                                 SelectedDate="{Binding Path=BindingDate, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

public class Context : INotifyPropertyChanged
    {
        public Context() { }

        private DateTime bindingDate = DateTime.Today;
        public DateTime BindingDate
        {
            get
            {
                return bindingDate;
            }
            set
            {
                if (DateTime.Compare(DateTime.Today, value) < 0)
                {
                    MessageBox.Show("Please Select Today date or older, Should not select future date");

//这不会在控件的SelectedDate属性中随时反映出来,为什么???                         value = DateTime.Today;                     }                     bindingDate = value;                     OnPropertyChanged( “BindingDate”);                 }             }

..是的我正在设置窗口的datacontext,如下所示:

public Window1()
        {
            InitializeComponent();
            this.DataContext = new Context(); 
        }

任何建议都将受到高度赞赏。

谢谢, -Mike

2 个答案:

答案 0 :(得分:1)

这是因为如果您为本地变量BindingDate设置值并且永远不会通知您的ui,则永远不会调用bindingDate setter。

而不是设置

private DateTime bindingDate = DateTime.Today.AddDays(13);

尝试设置

 BindingDate = DateTime.Today.AddDays(13);

修改

但是,即使在显示消息框之后,选择datepicker中的未来日期仍将保留,因为已在控件中进行了选择,并且不会重置。

但您可以考虑其他替代方法,例如使用datepicker的BlackoutDatesDisplayDates属性阻止所有未来日期的选择,或者您可以考虑使用下面帖子中提到的自定义验证规则

Date picker validation WPF

答案 1 :(得分:0)

您也可以考虑实现INotifyPropertyChanging,而不仅仅是INotifyPropertyChanged。 通过这种方式,您可以通知alsol您的属性即将更改,并相应地运行一些代码。 当然,请告知您的房产已经有效改变。