WPF中的日历控件表现奇怪

4

我将尝试将日历的“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>

以及我的视图模型

    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:

经过这一切,我已经将数据上下文分配给了视图模型。

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

绑定后的效果如下所示。

Image Binded with DisplayDAte

CASE 2:

接着,我尝试在不将DataContext与ViewModel进行赋值的情况下运行。

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

没有绑定的效果如下:

Without Binding

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


在setter中应该是OnPropertyChanged("Display"),而不是OnPropertyChanged("DisplayDate")。(与宽度问题无关) - Nikita Shrivastava
@Nikita。是的。现在已经更新了。谢谢你。 - Gopichandar
2个回答

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。

补充:在您的屏幕截图中,似乎需要使用SelectedDate技巧将您的日历日期设置为2015年,而不是1年。


太好了。它按预期工作了。非常感谢。但我仍然对其行为感到困惑。 - Gopichandar
非常奇怪...但这似乎解决了问题!如果有帮助,请随意接受答案。 - Giangregorio

0

导致日历控件拉伸的不是DisplayDate绑定,而是将DisplayMode设置为"Year"。看起来像是日历控件的一个bug。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接