刷新 IEnumerable 以更新日历中的月份

Refresh IEnumerable to update month in Calendar

我使用 ItemsControl 创建了自己的日历。但是为了使其功能齐全,我需要日历来显示在 ComboBox 中选择的月份。

现在它只显示当前月份并在列表框中列出每个日期的项目,但当我在 ComboBox 中更改月份或年份时它不会更新。

视图模型

private void RefreshCalendar()
{
    if (CurrentYearItem == 0) return;
    if (CurrentMonthItem == null) return;

    int year = (int)CurrentYearItem;
    int month = Months.IndexOf(CurrentMonthItem) +1 ;

    DateTime targetDate = new DateTime(year,month,1);

    Days= BuildCalendar(targetDate);
}

public IEnumerable<Day> Days { get; set; }

public IEnumerable<Day> BuildCalendar(DateTime targetDate)
{
    DateTime d = new DateTime(targetDate.Year, targetDate.Month, 1);
    int offset = DayOfWeekNumber(d.DayOfWeek);
    if (offset != 1) d = d.AddDays(-offset);

    for (int box = 1; box <= 42; box++)
    {
        var day = new Day { Date = d, Enabled = true, IsTargetMonth = targetDate.Month == d.Month };

        day.IsToday = d == DateTime.Today;
        d = d.AddDays(1);

        var viewSource = new CollectionViewSource
        {
            Source = SceneList
        };

        viewSource.Filter += new FilterEventHandler((o, e) =>
        {
           e.Accepted = (e.Item as Scene).Date == day.Date.ToString();
        });

        day.Scenes = viewSource.View;

        yield return day;
    }
}

每次组合框的值更改时如何刷新 IEnumerable,或者是否有其他方法可以实现此目的?

实现 INotifyPropertyChanged 接口。 这是一个例子:

class ClassTest : INotifyPropertyChanged
{
    private IEnumerable<Day> myList;
    public IEnumerable<Day> MyList
    {
        get { return myList; }
        set
        {
            if (value != myList)
            {
                myList= value;
                OnPropertyChanged("MyList");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

我不确定我是否完全了解您的情况。但是,如果我理解正确的话,您应该尝试使用 SelectionChangeCommitted 事件来查找组合框。

https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.selectionchangecommitted(v=vs.110).aspx

如果您只想查找组合框中的用户更改。不要使用 SelectedValueChanged 因为它也会在程序更改值时引发。