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

本文关键字:灰色 日期 DisplayDate 绑定 SelectedDate 日历 | 更新日期: 2023-09-27 18:19:37

原始用例:

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

  1. 用户打开我的日历设置为当前日期的页面
  2. 用户选择几个月前的日期
  3. 用户刷新页面,导致虚拟机中选定的日期重置为当前日期

预期:日历显示当前日期

实际:(仅在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和DisplayDate:灰色日期

我刚刚遇到这个问题,偶然发现了这个答案,尽管它有效,但我进一步解构,发现解决方案非常简单。只需将CCD_ 10作为CCD_。不需要其他任何东西。

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

我现在解决它的方法是在我的代码后面,在日历的加载事件上:

private void CalendarLoaded(object sender, RoutedEventArgs e)
{
    if (this.ViewStartCalendar.SelectedDate.HasValue)
    {
        this.ViewStartCalendar.DisplayDate = this.ViewStartCalendar.SelectedDate.Value;
    }
}

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