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

Raf*_*Raf 3 .net c# wpf calendar mvvm

原始用例:

这是我正在尝试解决的一个可能用例:

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

预期:日历显示现在日期

实际:(仅在 SelectedDate 上绑定)日历只移动其选定的日期,但保持显示先前选定的月份

我的解决方案:

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

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

这是我的 XAML 日历:

<Calendar SelectedDate="{Binding Path=SelectedDate}" DisplayDate="{Binding Path=SelectedDate}" />
Run Code Online (Sandbox Code Playgroud)

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

    public DateTime SelectedDate
    {
        get 
        { 
            return selectedDate; 
        }
        set 
        { 
            selectedDate = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("SelectedDate"));
        }
    }
Run Code Online (Sandbox Code Playgroud)

解决方案的问题:

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

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

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

感谢您的帮助!

小智 5

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

DisplayDate="{Binding SelectedDate, Mode=OneTime, UpdateSourceTrigger=PropertyChanged}"
SelectedDate="{Binding SelectedDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Run Code Online (Sandbox Code Playgroud)