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);
        }