刷新 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 事件来查找组合框。
如果您只想查找组合框中的用户更改。不要使用 SelectedValueChanged 因为它也会在程序更改值时引发。
我使用 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 事件来查找组合框。
如果您只想查找组合框中的用户更改。不要使用 SelectedValueChanged 因为它也会在程序更改值时引发。