2016-08-02 65 views
0

我在MVVM应用程序中使用常规的WPF日历(System.Windows.Controls.Calendar)。日历每次显示一个月,用户将选择一天。日历显示下个月底部的几天,这很好。日历数据绑定选择错误的日期

问题是如果我从下个月(例如下个月的第二天)选择一个日期,那么Calendar首先更新与此日期的数据绑定,然后立即用第一个月!

这种情况发生在我选择的下个月的所有日期。

日历的SelectedDate和DisplayDate属性是绑定到视图模型的Date属性的数据。

<Calendar SelectedDate="{Binding Date}" DisplayDate="{Binding Date}" /> 

视图模型看起来像这样

public class CalendarProblemDemoViewModel : INotifyPropertyChanged 
{ 
    private DateTime _date; 

    public CalendarProblemDemoViewModel() 
    { 
     _date = DateTime.Today; 
    } 

    public DateTime Date 
    { 
     get { return _date; } 
     set 
     { 
      _date = value; 
      Debug.Write($"new date {_date}\n"); 
      OnPropertyChanged(nameof(Date)); 
     } 
    } 
    // Note: other code omitted, see the github project 
} 

我不明白为什么会这样?

+1

所以你将两个都绑定到同一个属性Date。你有没有尝试看看“SelectedDate”与“DisplayDate”不同? –

+1

这实际上解决了问题哈哈!所以它与日历的内部工作有关?我想我会打开反汇编程序并看看。 – Grubl3r

+0

很高兴我们能够帮助:) –

回答

1

您不应该将SelectedDateDisplayDate都绑定到相同的属性Date

+0

这是正确的答案,但我不明白为什么这是真的吗? – Grubl3r

+1

它显示当前的日期(不是灰色),但你可以选择不同的日期(灰色)。因此,通过将两者都绑定到相同的属性,即使所选内容不同,该属性也会始终显示。 –

+1

如果你这样做,你可以保留两个:DisplayDate =“{绑定SelectedDate,模式=一次,UpdateSourceTrigger = PropertyChanged}” SelectedDate =“{Binding SelectedDate,Mode = TwoWay,UpdateSourceTrigger = PropertyChanged}”' –