日历绑定 SelectedDate 和 DisplayDate:灰色日期

Posted

技术标签:

【中文标题】日历绑定 SelectedDate 和 DisplayDate:灰色日期【英文标题】:Calendar binding SelectedDate and DisplayDate: gray dates 【发布时间】:2012-01-07 13:55:20 【问题描述】:

原始用例:

这是我试图解决的一个可能的用例:

    用户打开页面时我的日历设置为现在日期 用户选择几个月前的日期 用户刷新页面,导致 VM 中的选定日期重置为现在日期

预期:日历显示现在日期

实际:(仅在 SelectedDate 上绑定)日历仅移动其选定的日期,但继续显示之前选择的月份

我的解决方案:

在 MVVM 场景中,我展示了一个 Calendar 控件,其 SelectedDate 绑定到我的 ViewModel 中的 SelectedDate 属性。我的 VM 中的属性在设置时会触发它的 PropertyChanged 事件。

我的虚拟机中的选定日期也可以从我的代码中的其他部分设置,所以我希望我的日历始终显示选定的日期(例如,当另一个月份设置为选定的日期时,我希望我的日历切换到那个月)。为了获得这种行为,我还将日历的 DisplayDate 属性绑定到我的 SelectedDate 属性,这给了我预期的行为,除非我单击上个月或下个月的灰色日期。

这是我的 XAML 日历:

<Calendar SelectedDate="Binding Path=SelectedDate" DisplayDate="Binding Path=SelectedDate" />

这是我的 ViewModel 中的 SelectedDate 属性(实现 INotifyPropertyChanged

    public DateTime SelectedDate
    
        get 
         
            return selectedDate; 
        
        set 
         
            selectedDate = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("SelectedDate"));
        
    

解决的问题:

显然单击灰色日期会导致SelectedDate 在鼠标按下和鼠标向上时再次设置,这会导致选择两个月后的日期。

有没有更好的方法来实现这种行为?或者我可以修复 DisplayDate 问题(没有太多的黑客攻击,意味着代码中没有/尽可能少的代码)?

我真正想要的是一个SelecteDate 属性,它也具有DisplayDate 属性的行为:)

感谢您的帮助!

【问题讨论】:

您是说您希望日历始终显示 SelectedDate 的月份(打开时)? 是的,我希望日历始终在我的视图模型的 SelectedDate 属性中显示日期。此日期也可以在视图模型中更改,因此我希望日历始终跳转到所选日期。 【参考方案1】:

我刚刚遇到了这个问题,偶然发现了这个答案,虽然它有效,但我进一步解构并发现解决方案非常简单。只需将DisplayDate 绑定为Mode=OneTime。不需要其他任何东西。

DisplayDate="Binding SelectedDate, Mode=OneTime, UpdateSourceTrigger=PropertyChanged"
SelectedDate="Binding SelectedDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged"

【讨论】:

【参考方案2】:

我现在决定修复它的方式是在我的代码后面,在日历的加载事件上:

private void CalendarLoaded(object sender, RoutedEventArgs e)

    if (this.ViewStartCalendar.SelectedDate.HasValue)
    
        this.ViewStartCalendar.DisplayDate = this.ViewStartCalendar.SelectedDate.Value;
    

我宁愿在 XAML 或我的视图模型中完成它,但我可以接受这个解决方案。

【讨论】:

谢谢,如果有干净的 MVVM 方法来解决这个问题,我很高兴听到它。

以上是关于日历绑定 SelectedDate 和 DisplayDate:灰色日期的主要内容,如果未能解决你的问题,请参考以下文章

输入文本时 DatePicker.SelectedDate 不变

系统日历获取系统时间

Qt入门系列开发教程基础控件篇QCalendarWidget日历控件

FPDF:不为日历选定日期生成报告数据

系统日期时间?与 System.DateTime

如果显示的第一个月是12月,使用.data()。datepicker.drawMonth日历的Jquery Datepicker会跳一年