扩展WPF日历以支持同时选择多个日期
我想在WPF扩展WPF日历以支持同时选择多个日期,wpf,datagrid,wpf-controls,wpfdatagrid,selecteditem,Wpf,Datagrid,Wpf Controls,Wpfdatagrid,Selecteditem,我想在WPFCalendar控件中添加一个方法,使其能够一次选择多个日期,并在最后只提升一次SelectedDatesChangedEvent WPFCalendar控件允许您一次只添加一个日期(范围对我没有用处)。但是,我可能需要添加大约1000个日期,我不希望将SelectedDatesChangedEvent处理程序调用1000次,因为在我的情况下,这是一个昂贵的操作 WPFDataGrid有一个非常好的功能,可以实现这一点: public class MyDataGrid : DataG
Calendar
控件中添加一个方法,使其能够一次选择多个日期,并在最后只提升一次SelectedDatesChangedEvent
WPFCalendar
控件允许您一次只添加一个日期(范围对我没有用处)。但是,我可能需要添加大约1000个日期,我不希望将SelectedDatesChangedEvent
处理程序调用1000次,因为在我的情况下,这是一个昂贵的操作
WPFDataGrid
有一个非常好的功能,可以实现这一点:
public class MyDataGrid : DataGrid
{
public void ClearAndSelectMany(IEnumerable<DateTime> datesToBeSelected)
{
this.BeginUpdateSelectedItems();
...
foreach (DateTime date in datesToBeSelected)
this.SelectedDates.Add(date);
...
this.EndUpdateSelectedItems();
}
}
现在我的问题是调用base.OnSelectedDatesChanged()时出现异常
我想我没有在末尾正确创建SelectionChangedEventArgs
对象,但我不知道如何正确创建。任何帮助都将不胜感激
更新:受Jamleck问题的启发,我在一个新项目中重新创建了这个问题,现在有更多的信息要提供。以下是MyCalendar
课程:
public class MyCalendar : System.Windows.Controls.Calendar
{
private bool temporaryDontReportSelectionChanged;
public MyCalendar()
{
// removing this line below makes my problem go away and it works ok
this.SelectedDatesChanged += MyCalendar_SelectedDatesChanged;
}
void MyCalendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{
}
protected override void OnSelectedDatesChanged(SelectionChangedEventArgs e)
{
if (!temporaryDontReportSelectionChanged)
base.OnSelectedDatesChanged(e);
}
public void ClearAndSelectMany(IEnumerable<DateTime> datesToBeSelected)
{
this.temporaryDontReportSelectionChanged = true;
...
foreach (DateTime date in datesToBeSelected)
SelectedDates.Add(date);
...
this.temporaryDontReportSelectionChanged = false;
OnSelectedDatesChanged(
new SelectionChangedEventArgs(
MyCalendar.SelectedDatesChangedEvent,
removedDates.ToList(),
addedDates.ToList()));
}
}
公共类MyCalendar:System.Windows.Controls.Calendar
{
私有布尔临时不报告选择已更改;
公共日历()
{
//删除下面的这一行可以消除我的问题,并且效果良好
this.SelectedDatesChanged+=我的日历\u SelectedDatesChanged;
}
void MyCalendar\u SelectedDatesChanged(对象发送者,selectionchangedventargs e)
{
}
选定日期更改时受保护的覆盖无效(SelectionChangedEventArgs e)
{
如果(!temporaryDontReportSelectionChanged)
根据选定的日期(e);
}
public void clear和selectmany(IEnumerable dates待选)
{
this.temporaryDontReportSelectionChanged=true;
...
foreach(DateTime日期在DateToBeSelected中)
选择日期。添加(日期);
...
this.temporaryDontReportSelectionChanged=false;
选定日期(
新选择ChangedEventArgs(
MyCalendar.SelectedDatesChangedEvent,
removedDates.ToList(),
addedates.ToList());
}
}
因此,如果我没有将事件处理程序添加到SelectedDatesChanged
事件处理程序中,一切都很好,但是如果我添加了它,那么我会得到上面描述的InvalidCastException
。您的目标是.Net的哪个版本?我运行了你的代码,没有发现任何关于多个日期选择的问题。感谢@Jamleck的检查,我使用的是.Net 4.5,Visual Studio 2013 Update 1,但我认为这不是问题所在,我只是用更多的信息更新了上面的问题。
Unable to cast object of type
'System.EventHandler`1[System.Windows.Controls.SelectionChangedEventArgs]'
to type
'System.Windows.Controls.SelectionChangedEventHandler'.
public class MyCalendar : System.Windows.Controls.Calendar
{
private bool temporaryDontReportSelectionChanged;
public MyCalendar()
{
// removing this line below makes my problem go away and it works ok
this.SelectedDatesChanged += MyCalendar_SelectedDatesChanged;
}
void MyCalendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{
}
protected override void OnSelectedDatesChanged(SelectionChangedEventArgs e)
{
if (!temporaryDontReportSelectionChanged)
base.OnSelectedDatesChanged(e);
}
public void ClearAndSelectMany(IEnumerable<DateTime> datesToBeSelected)
{
this.temporaryDontReportSelectionChanged = true;
...
foreach (DateTime date in datesToBeSelected)
SelectedDates.Add(date);
...
this.temporaryDontReportSelectionChanged = false;
OnSelectedDatesChanged(
new SelectionChangedEventArgs(
MyCalendar.SelectedDatesChangedEvent,
removedDates.ToList(),
addedDates.ToList()));
}
}