c# – INotifyPropertyChanged和ObservableCollection WPF
发布时间:2020-12-16 00:00:54 所属栏目:百科 来源:网络整理
导读:现在我有一个只显示一个月的日历(我通过的月份).我试图让用户从comboBox中选择月份和年份并更新日历.我使用observablecollection绑定,我很熟悉.我不知道INotifyPropertyChanged如何工作.我以前从未使用过它.非常感谢任何帮助或建议.这是我到目前为止: publi
现在我有一个只显示一个月的日历(我通过的月份).我试图让用户从comboBox中选择月份和年份并更新日历.我使用observablecollection绑定,我很熟悉.我不知道INotifyPropertyChanged如何工作.我以前从未使用过它.非常感谢任何帮助或建议.这是我到目前为止:
public class Schedule : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void Update(int propertyName) { if (propertyName != null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler.Invoke(this,new PropertyChangedEventArgs(propertyName.ToString())); } } // public void UpdateCal(PropertyChangedEventArgs e) // { // if (PropertyChanged != null) // PropertyChanged(this,e); // } public string MonthWeek { get; set; } public string Year { get; set; } public string Month { get; set; } public string day { get; set; } public string WeekOfYear { get; set; } public string dayofweek { get; set; } // public string month { // get {return Month; } // set // { // UpdateCal(new PropertyChangedEventArgs("month")); // } // } public int WeekNo { get; set; } public int WeekDay { get; set; } public DateTime Date { get; set; } } —这是另一个类,它确定了每个日期在网格上的位置—- public SchedulePage(MainWindow parentForm) { InitializeComponent(); pick = Convert.ToInt32(comboMonth.SelectedItem) + 1; _parentForm = parentForm; // DateTime date = new DateTime(year,month,day); var t = new List<Schedule>(); DateTime curr = DateTime.Now; // comboMonth.Items.Add(curr.Month); DateTime newcurr = new DateTime(2011,pick,1); // pickdate = datePickercal.SelectedDate; // DateTime newcurr = new DateTime(curr.Year,curr.Month,1); var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar; var ms = cal.GetWeekOfYear(new DateTime(newcurr.Year,newcurr.Month,1),System.Globalization.CalendarWeekRule.FirstDay,System.DayOfWeek.Sunday); for (var i = 1; newcurr.Month == pick; newcurr = newcurr.AddDays(1)) { var sched = new Schedule(); var month_week = (newcurr.Day / 7) ; sched.MonthWeek = newcurr.GetWeekOfMonth().ToString(); sched.Month = newcurr.Month.ToString(); sched.Year = newcurr.Year.ToString(); sched.day = newcurr.Day.ToString(); sched.WeekOfYear = cal.GetWeekOfYear(newcurr,DayOfWeek.Sunday).ToString(); sched.dayofweek = newcurr.DayOfWeek.ToString(); t.Add(sched); _parentForm.bindings.schedule.Add(new Schedule { WeekNo = newcurr.GetWeekOfMonth()-1,WeekDay = (int)newcurr.DayOfWeek,day = newcurr.Day.ToString() }); } lblDate.Content = (newcurr.Month -1) + "/" + newcurr.Year; DataContext = _parentForm.Bindings; —这个类使观察收集—– public partial class BindingCamper { // This class assist in binding campers from listview to the textboxes on the camperspage public ObservableCollection<Camper> Campers { get; set; } public ObservableCollection<Staff> StaffMembers { get; set; } public ObservableCollection<Schedule> schedule { get; set; } public BindingCamper() { Campers = new ObservableCollection<Camper>(); StaffMembers = new ObservableCollection<Staff>(); schedule = new ObservableCollection<Schedule>(); } 解决方法
这是您通常实现INotifyPropertyChanged的方式:
public class Schedule : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) handler(this,new PropertyChangedEventArgs(propertyName)); } private string _monthWeek; public string MonthWeek { get { return _monthWeek; } set { if (value != _monthWeek) { _monthWeek = value; OnPropertyChanged("MonthWeek"); } } } // And so on for other properties... } 基本上,每次更新属性时都需要触发PropertyChanged事件,因此每个setter都必须调用OnPropertyChanged.请注意,您无法使用自动实现的属性执行此操作,因为您需要在setter中添加自定义逻辑. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |