You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:22:46