【问题标题】:Refresh IEnumerable to update month in Calendar刷新 IEnumerable 以更新日历中的月份
【发布时间】:2015-10-10 13:44:52
【问题描述】:

我使用 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 还是有其他方法可以实现这一点?

【问题讨论】:

    标签: c# wpf calendar ienumerable observablecollection


    【解决方案1】:

    实现 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));
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多