我正在尝试在日期时间选择器控件中验证所选日期,并将所选日期设置为今天的日期,如果选择的日期是> 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
答案 0 :(得分:1)
这是因为如果您为本地变量BindingDate
设置值并且永远不会通知您的ui,则永远不会调用bindingDate
setter。
而不是设置
private DateTime bindingDate = DateTime.Today.AddDays(13);
尝试设置
BindingDate = DateTime.Today.AddDays(13);
修改强>
但是,即使在显示消息框之后,选择datepicker中的未来日期仍将保留,因为已在控件中进行了选择,并且不会重置。
但您可以考虑其他替代方法,例如使用datepicker的BlackoutDates或DisplayDates属性阻止所有未来日期的选择,或者您可以考虑使用下面帖子中提到的自定义验证规则
答案 1 :(得分:0)
您也可以考虑实现INotifyPropertyChanging,而不仅仅是INotifyPropertyChanged。 通过这种方式,您可以通知alsol您的属性即将更改,并相应地运行一些代码。 当然,请告知您的房产已经有效改变。