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
控件中的错误。
我正在尝试绑定日历的“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
控件中的错误。