原始用例:
这是我试图解决的一个可能的用例:
)。
预期:日历显示现在的日期
实际:(仅在SelectedDate上绑定)日历只移动其选定的日期,但始终显示先前选定的月份
我的解决方案:
在MVVM场景中,我展示了一个Calendar控件,它的SelectedDate绑定到SelectedDate中的SelectedDate属性。我的VM中的属性在设置时触发它的PropertyChanged事件。
VM中的选定日期也可以从代码中的其他部分中设置,因此我希望我的日历总是显示选定的日期(例如,当另一个月被设置为选定的日期时,我希望我的日历切换到那个月)。为了获得这种行为,我还将日历的DisplayDate属性绑定到我的SelectedDate属性,这给出了预期的行为,除非我单击前一个月或下个月的灰色日期。
这是我在XAML中的日历:
<Calendar SelectedDate="{Binding Path=SelectedDate}" DisplayDate="{Binding Path=SelectedDate}" />这是我的SelectedDate中的ViewModel属性(实现INotifyPropertyChanged)
    public DateTime SelectedDate
    {
        get 
        { 
            return selectedDate; 
        }
        set 
        { 
            selectedDate = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("SelectedDate"));
        }
    }问题的解决方案:
显然,单击灰色日期会导致鼠标向下设置SelectedDate,并再次设置鼠标向上,这将导致选择两个月后的日期。
有更好的方法来实现这种行为吗?或者我可以修复DisplayDate问题(没有太多的黑客攻击,意味着后面的代码中没有/尽可能少的代码)?
我真正需要的是一个SelecteDate属性,它也具有DisplayDate属性的行为:)
谢谢你的帮助!
发布于 2012-02-03 07:48:29
我现在决定修复它的方式在我后面的代码中,在日历的加载事件上:
private void CalendarLoaded(object sender, RoutedEventArgs e)
{
    if (this.ViewStartCalendar.SelectedDate.HasValue)
    {
        this.ViewStartCalendar.DisplayDate = this.ViewStartCalendar.SelectedDate.Value;
    }
}我宁愿在XAML或视图模型中这样做,但我可以接受这个解决方案。
发布于 2016-06-20 02:33:00
我刚刚遇到了这个问题,无意中发现了这个答案,尽管它起了作用,但我进一步解构,发现解决方案非常简单。只需将DisplayDate绑定为Mode=OneTime即可。不需要别的了。
DisplayDate="{Binding SelectedDate, Mode=OneTime, UpdateSourceTrigger=PropertyChanged}"
SelectedDate="{Binding SelectedDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"https://stackoverflow.com/questions/8770181
复制相似问题