private void CellTraversal <TValue, TRootItem>(TimeRange timeRange, int[] dataRowRange, object newValue, Action <TRootItem> rootItemPreparing, Action <TRootItem> rootItemCellsValueChanged, IList itemsSource, System.Func <TValue, ITerm, bool> eq, System.Func <TValue, TRootItem, ITerm, DateTime?> func, Action callback, CellEditRoutedEventArgs e) where TRootItem : IEnumerable { if (ReferenceEquals(newValue, default(TValue))) { return; } var value = newValue.As <TValue>(); //xvar timeRange = new Core.Reflector(layer).Property<TimeRange>("TimeRange"); //xvar dataRowRange = new Core.Reflector(layer).Property<int[]>("DataRowRange"); var dirty = false; // TODO:以下搜索不支援HRDate, 将来必须修正 for (var i = dataRowRange[0]; i <= dataRowRange[1]; i++) { var anyChanged = false; var rootItem = itemsSource[i].As <TRootItem>(); rootItemPreparing(rootItem); rootItem.SaftyInvoke <IIntIndexer>(root => { var day = timeRange.Start.Date; var end = timeRange.End.Date; while (day < end) { var item = root.GetItem(day.IndexOf(_schedule.Start)) as ITerm; var effectDate = func(value, rootItem, item); if (effectDate != null) { rootItem.SaftyInvoke <IDateIndexer <DateTerm> >(r => { r[effectDate.Value] = new DateTerm(effectDate.Value, string.Empty); }); //xMarkAsChanged(changedCell, new Core.Tuple<int, DateTerm>(i, new DateTerm(effectDate.Value,string.Empty))); anyChanged = true; } day = day.AddDays(1); } }); if (anyChanged) { rootItemCellsValueChanged(rootItem); dirty = true; } } if (dirty) { e.SaftyInvoke(o => { o.HasChanged = true; }); if (timeRange.Start.Date < _alterDateRange[0]) { _alterDateRange[0] = timeRange.Start.Date; } if (_alterDateRange[1] < timeRange.End.Date) { _alterDateRange[1] = timeRange.End.Date; } callback(); } }
private void CellTraversal <TValue, TRootItem>(object layer, object newValue, Action <TRootItem> rootItemPreparing, Action <TRootItem> rootItemCellsValueChanged, IList itemsSource, System.Func <TValue, TRootItem, ITerm, DateTime?> func, Action callback, CellEditRoutedEventArgs e) where TRootItem : IEnumerable { if (layer == null) { return; } var timeRange = new Core.Reflector(layer).Property <TimeRange>("TimeRange"); var dataRowRange = new Core.Reflector(layer).Property <int[]>("DataRowRange"); CellTraversal(timeRange, dataRowRange, newValue, rootItemPreparing, rootItemCellsValueChanged, itemsSource, (value, item) => Equals(value, item), func, callback, e); }