扩展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

我想在WPF
Calendar
控件中添加一个方法,使其能够一次选择多个日期,并在最后只提升一次
SelectedDatesChangedEvent

WPF
Calendar
控件允许您一次只添加一个日期(范围对我没有用处)。但是,我可能需要添加大约1000个日期,我不希望将
SelectedDatesChangedEvent
处理程序调用1000次,因为在我的情况下,这是一个昂贵的操作

WPF
DataGrid
有一个非常好的功能,可以实现这一点:

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()));
    }
}