/// <summary>
        /// Opens the FilterOptionPopup with the FilterOptionList.
        /// </summary>
        public virtual void OpenFilterOptionPopup()
        {
            if (this.FilterOptionButtonVisibility == Visibility.Collapsed)
            {
                return;
            }
            if (!this.ColumnBase.IsEditing)
            {
                this.ColumnBase.Renderer.DataGrid.SelectionController.CurrentCellManager.BeginEdit();
            }
            var list = this.GetFilterOptionsList();

            if (list.Count > 0)
            {
                this.FilterOptionsList.ItemsSource  = list;
                this.FilterOptionsList.SelectedItem = FilterRowHelpers.GetResourceWrapper(this.ColumnBase.GridColumn.FilterRowCondition);
#if !WPF
                this.FilterOptionPopup.VerticalOffset = this.ActualHeight;
#endif
                FilterOptionPopup.IsOpen = true;
#if WPF
                this.FilterOptionsList.ItemContainerGenerator.StatusChanged += OnItemContainerGeneratorStatusChanged;
#endif
            }
        }
        /// <summary>
        /// Gets the list of FilterPredicates for the corresponding column.
        /// </summary>
        /// <param name="filterValue">Value that want to be filter in corresponding column.</param>
        /// <returns>
        /// Returns the list of FilterPredicates that have been generated for the particular column.
        /// </returns>
        protected List<FilterPredicate> GetFilterPredicates(object filterValue)
        {
            var column = this.FilterRowCell.DataColumn.GridColumn;
            if (column == null)
                return null;

            var filterPredicates = new List<FilterPredicate>();
            if (column.FilterRowCondition == FilterRowCondition.NotNull || column.FilterRowCondition == FilterRowCondition.Null)
                filterValue = null;
            else if (column.FilterRowCondition == FilterRowCondition.Empty || column.FilterRowCondition == FilterRowCondition.NotEmpty)
                filterValue = string.Empty;
            else if ((filterValue == null || filterValue.ToString() == string.Empty))
                return filterPredicates;

            var filterMode = isSupportDisplayTextFiltering(column) || (column.GetType() != typeof(GridTextColumn) && column.GetFilterBehavior() == FilterBehavior.StringTyped) ? ColumnFilter.DisplayText : ColumnFilter.Value;
            var filterPredicate = new FilterPredicate()
            {
                FilterBehavior = column.GetFilterBehavior(),
                FilterType = FilterRowHelpers.GetFilterType(column.FilterRowCondition),
                FilterValue = filterValue,
                IsCaseSensitive = column.IsCaseSensitiveFilterRow,
                PredicateType = PredicateType.And ,
                FilterMode = filterMode
            };
            filterPredicates.Add(filterPredicate);
            return filterPredicates;
        }
        /// <summary>
        /// Process the filtering when the FilterRowCondition is changed in corresponding column.
        /// </summary>
        /// <param name="filterRowCondition">The new FilterRowCondition that have been changed.</param>
        public virtual void OnFilterRowConditionChanged(string filterRowCondition)
        {
            if (filterRowCondition == FilterRowHelpers.GetResourceWrapper(this.FilterRowCell.DataColumn.GridColumn.FilterRowCondition))
                return;

            this.FilterRowCell.DataColumn.GridColumn.UpdateFilterType(FilterRowHelpers.GetFilterRowCondition(filterRowCondition));
            object filterValue;
            if (this.IsInEditing)
                filterValue = this.GetControlValue();
            else
                filterValue = this.FilterRowCell.DataColumn.GridColumn.FilterPredicates.Count > 0 && this.FilterRowCell.DataColumn.GridColumn.FilteredFrom == FilteredFrom.FilterRow
                    ? this.FilterRowCell.DataColumn.GridColumn.FilterPredicates[0].FilterValue : null;
            var filterType = this.FilterRowCell.DataColumn.GridColumn.FilterRowCondition;
            this.ProcessSingleFilter(filterValue);
            this.SetFocus(true);
            if (this.IsInEditing && (filterType == FilterRowCondition.Empty || filterType == FilterRowCondition.NotEmpty || filterType == FilterRowCondition.NotNull
            || filterType == FilterRowCondition.Null))
            {                
                this.SetControlValue(null);
                this.DataGrid.SelectionController.CurrentCellManager.EndEdit();
            }
            else if (!this.IsInEditing)
#if WPF
                Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
                {
#endif
                    this.DataGrid.SelectionController.CurrentCellManager.BeginEdit();
#if WPF
                }), DispatcherPriority.ApplicationIdle);
#endif
        }
        /// <summary>
        /// Gets the FilterText that want to be displayed in particular FilterRow Cell.
        /// </summary>
        /// <param name="filterValues">The list of FilterPredicates that have been created to the particular column.</param>
        public virtual string GetFilterText(List<FilterPredicate> filterPredicates)
        {
            string _filterText = string.Empty;

            if (filterPredicates.Count > 0)
            {
#if WPF
                if(this.EditorType == typeof(ComboBoxAdv) && this.HasCurrentCellState)
                {
                    var comboBox = (ComboBoxAdv) this.CurrentCellRendererElement;
                    if (comboBox.AllowMultiSelect)
                    {
                        var selectedItems = ((IList) comboBox.SelectedItems).Cast<FilterRowElement>().ToList();
                        foreach (var item in selectedItems)
                        {
                            _filterText += item.DisplayText;
                            if (selectedItems.IndexOf(item) < selectedItems.Count - 1)
                                _filterText += comboBox.SelectedValueDelimiter;
                        }
                    }
                    else
                        _filterText = (comboBox.SelectedItem as FilterRowElement).DisplayText;
                    return _filterText;
                }
#endif
                var filterRowCond = this.FilterRowCell.DataColumn.GridColumn.FilterRowCondition;
                if (filterRowCond == FilterRowCondition.Null || filterRowCond == FilterRowCondition.NotNull
                    || filterRowCond == FilterRowCondition.Empty || filterRowCond == FilterRowCondition.NotEmpty)
                    _filterText = FilterRowHelpers.GetResourceWrapper(this.FilterRowCell.DataColumn.GridColumn.FilterRowCondition);
                else
                {
                    var filterValue = filterPredicates[0].FilterValue;
                    if (filterValue != null && filterValue.ToString() != string.Empty)
                        _filterText = this.FilterRowCell.DataColumn.GridColumn.GetFormatedFilterText(filterValue);
                }
            }

            return _filterText;
        }