/// <summary>
        /// Return ValueFunc for based on corresponding  column and DataOperationMode
        /// </summary>
        /// <param name="view">CollectionViewAdv</param>
        /// <param name="column">GridColumn</param>
        /// <param name="operation">DataOperation</param>
        /// <param name="mode">DataReflectionMode</param>
        /// <param name="useBindingValue">useBindingValue</param>
        /// <returns>Func<string, object, object></returns>
        public static Func <string, object, object> GetValueFunc(this CollectionViewAdv view, GridColumn column, DataOperation operation, DataReflectionMode mode, bool useBindingValue)
        {
            if (operation == DataOperation.Grouping)
            {
                var pgd = view.GroupDescriptions.OfType <ColumnGroupDescription>().FirstOrDefault(g => g.PropertyName == column.mappingName);
                if (pgd != null && pgd.Converter != null)
                {
                    Func <string, object, object> groupConverterFunc = (columnName, record) =>
                    {
                        //The ColumnName and the PropertyReflector helps to get the value to Group the Column with the Intervals.
                        if (pgd.Converter is IColumnAccessProvider)
                        {
                            (pgd.Converter as IColumnAccessProvider).ColumnName        = columnName;
                            (pgd.Converter as IColumnAccessProvider).PropertyReflector = view.GetPropertyAccessProvider();
                        }
                        return(pgd.Converter.Convert(record, record.GetType(), column, CultureInfo.CurrentCulture.GetCulture()));
                    };
                    return(groupConverterFunc);
                }
            }

            if (column != null && column.IsUnbound)
            {
                var unboundcolumn = column as GridUnBoundColumn;
                var dataGrid      = view.GetDataGrid() as SfDataGrid;
                return(view.GetUnboundFunc(dataGrid, unboundcolumn));
            }

            else if (mode == DataReflectionMode.Default)
            {
                if (column != null && column.ValueBinding != null && column.UseBindingValue)
                {
                    return(view.GetBindingFunc());
                }
#if WPF
                if (view.IsITypedListSource())
                {
                    var func = view.GetITypedListFunc(column.MappingName);
                    if (func != null)
                    {
                        return(func);
                    }
                }
#endif
                if (view.IsDynamicBound)
                {
                    return(view.GetDynamicFunc());
                }

                if (view.IsXElementBound)
                {
                    return(view.GetXElementFunc());
                }
            }
            else if (mode == DataReflectionMode.Display)
            {
                return((propname, record) => view.GetPropertyAccessProvider().GetDisplayValue(record, propname, useBindingValue));
            }
            else if (mode == DataReflectionMode.Value)
            {
                return((propName, record) => view.GetPropertyAccessProvider().GetValue(record, propName, useBindingValue));
            }
            return(null);
        }
        /// <summary>
        /// Return XElement ExpressionFunc to reflect the value form XElement collection
        /// </summary>
        /// <param name="view">CollectionViewAdv</param>
        /// <returns>XElement ExpressionFunc</returns>
        internal static System.Linq.Expressions.Expression <Func <string, object, object> > GetXElementAttributeFunc(this CollectionViewAdv view)
        {
            var func = view.GetXElementFunc();

            return((propertyName, record) => func(propertyName, record));
        }