如何在PropertyChanged事件中更新ObservableCollection后续ThirdLevelViewModel的StartTime
层级活动中ThirdLevel时长变更后更新后续项开始时间
核心逻辑实现
当某个ThirdLevelViewModel的Duration属性变更时,定位它在ThirdLevels集合中的位置,从下一项开始,依次用前一项的StartTime + Duration更新当前项的StartTime即可。以下是thirdLevel_PropertyChanged方法的具体实现:
private void thirdLevel_PropertyChanged(object? sender, PropertyChangedEventArgs e) { // 仅响应Duration属性的变更 if (e.PropertyName != nameof(ThirdLevelViewModel.Duration)) return; var changedThirdLevel = sender as ThirdLevelViewModel; if (changedThirdLevel == null) return; int currentIndex = ThirdLevels.IndexOf(changedThirdLevel); // 如果是集合最后一项,无需更新后续内容 if (currentIndex == ThirdLevels.Count - 1) return; // 遍历后续所有项,依次更新StartTime for (int i = currentIndex + 1; i < ThirdLevels.Count; i++) { var prevItem = ThirdLevels[i - 1]; var currentItem = ThirdLevels[i]; // 计算新的开始时间:前一项的开始时间 + 前一项的时长 currentItem.StartTime = prevItem.StartTime.Add(prevItem.Duration); // 若StartTime的setter未自动触发PropertyChanged,需手动调用(根据你的ViewModel实现调整) // currentItem.OnPropertyChanged(nameof(ThirdLevelViewModel.StartTime)); } }
关键注意事项
- PropertyChanged触发:确保
ThirdLevelViewModel的StartTime和Duration属性在setter中正确触发PropertyChanged事件,否则UI不会同步更新。 - 集合变更的事件绑定:在
ThirdLevels的CollectionChanged事件处理中,为新增的ThirdLevelViewModel绑定PropertyChanged事件,同时为移除的项解绑事件,避免内存泄漏。 - 时间类型兼容:如果
Duration不是TimeSpan类型(比如整数分钟数),需先转换为TimeSpan再执行加法操作,例如TimeSpan.FromMinutes(prevItem.Duration)。
内容的提问来源于stack exchange,提问作者AAang
相关产品推荐
相关产品推荐

