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

时间:2015-09-03 07:39:12

标签: c# wpf binding wpf-controls

我正在尝试绑定日历的“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:

毕竟这一切。我已经使用viewmodel分配了datacontext。

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

这是绑定后的看法。

Image Binded with DisplayDAte

案例2:

然后,我试着没有使用ViewModel分配DataContext。

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

这是没有绑定的外观

Without Binding

为什么在分配DataContext时宽度变得奇怪?有什么我做错了。 。

2 个答案:

答案 0 :(得分:3)

由于未知原因,该问题似乎与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。

补充:有必要将您的日历日期设置为2015年的SelectedDate技巧,在截图中为第1年; - )

答案 1 :(得分:0)

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