日历绑定SelectedDate和DisplayDate:灰色日期
本文关键字:灰色 日期 DisplayDate 绑定 SelectedDate 日历 | 更新日期: 2023-09-27 18:19:37
原始用例:
这是我试图解决的一个可能的用例:
- 用户打开我的日历设置为当前日期的页面
- 用户选择几个月前的日期
- 用户刷新页面,导致虚拟机中选定的日期重置为当前日期
预期:日历显示当前日期
实际:(仅在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
属性的行为:)
谢谢你的帮助!
我刚刚遇到这个问题,偶然发现了这个答案,尽管它有效,但我进一步解构,发现解决方案非常简单。只需将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或我的视图模型中完成它,但我可以接受这个解决方案。