WPF 中的日历控件奇怪的行为

Calendar Control in WPF weird behavior

我正在尝试绑定日历的“DisplayDate”以使控件在日期发生变化时发出通知。

这是我的xaml

<Window x:Class="CalenderControl.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>        
            <Calendar x:Name="_calendar" DisplayMode="Year"  DisplayDate="{Binding Display}"/>        
    </Grid>
</Window>

和我的 ViewModel

    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }

        private DateTime _displayDate;

        public DateTime Display
        {
            get { return _displayDate; }
            set { _displayDate = value; OnPropertyChanged("Display"); }
        }

    }

案例 1:

毕竟。我已经为 datacontext 分配了 viewmodel。

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ViewModel() { Display = DateTime.Parse("10/10/2015") };
        } 

这是绑定后的样子。

案例 2:

然后,我尝试不使用 ViewModel 分配 DataContext。

        public MainWindow()
        {
            InitializeComponent();
            // --- Commenting out ---
            //this.DataContext = new ViewModel() { Display = DateTime.Parse("10/10/2015") };  
        } 

这是没有绑定的样子

为什么分配 DataContext 时宽度变得奇怪?我做错了什么吗? .

由于未知原因,该问题似乎与 DisplayMode="Year"

有关

我可以建议您执行以下步骤,似乎在我的测试应用中有效。

1) 从 Xaml 中删除 DisplayMode 2)设置DataContext后,追加:

  Action act = delegate()
  {
    _calendar.SelectedDate = ((ViewModel)DataContext).Display;
    _calendar.DisplayMode = CalendarMode.Year;
    _calendar.SelectedDate = null;
  };
  Dispatcher.BeginInvoke(act, DispatcherPriority.ApplicationIdle);

看起来很奇怪,但应该可以。如果需要,您无法将 SelectedDate 设置回 null。

补充:SelectedDate 技巧似乎是将您的日历日期设置为 2015 年所必需的,在您的屏幕截图中是第 1 年 ;-)

导致 Calendar 控件拉伸的不是 DisplayDate 绑定;它正在将 DisplayMode 设置为“Year”。它看起来像是 Calendar 控件中的错误。