【问题标题】:Calendar Control in WPF weird behaviorWPF中的日历控件奇怪的行为
【发布时间】:2015-11-28 22:29:10
【问题描述】:

我正在尝试绑定日历的“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 时宽度会变得奇怪?有什么我做错了吗。 .

【问题讨论】:

  • 应该是 OnPropertyChanged("Display");不是 OnPropertyChanged("DisplayDate");在setter中。(与宽度问题无关)
  • @尼基塔。 .是的。现在更新了。谢谢你。

标签: c# wpf binding wpf-controls


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 万岁。 .它按预期工作。 .非常感谢。我仍然对这种行为感到困惑。
    • 非常非常奇怪....但这似乎可以解决问题!如果对您有帮助,请随时接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多