I'm trying to create a custom filter for a RadGridView, but no matter what I do I get the following error.
The value "(CategoryList Contains Allergies)" is not of type "Telerik.Windows.Data.IFilterDescriptor" and cannot be used in this generic collection.Parameter name: value
The column that the filter is on contains a List<string> of possibly multiple category names in each row and the filter contains a distinct list of the categories.
001.public partial class CategoryFilter : UserControl, IFilteringControl002.{003. private GridViewBoundColumnBase _column;004. 005. public delegate void BeginCategoryChangeEvent();006. public event BeginCategoryChangeEvent BeginCategoryChange;007. 008. public delegate void CategoryChangeEvent();009. public event CategoryChangeEvent CategoryChange;010. private CompositeFilterDescriptor _compositeFilter;011. 012. 013. public class CategoryItem014. {015. public string CategoryName { get; set; }016. public bool IsChecked { get; set; }017. }018. 019. private List<CategoryItem> MainCategoryList;020. 021. /// <summary>022. /// Gets or sets a value indicating whether the filtering is active.023. /// </summary>024. public bool IsActive025. {026. get { return (bool)GetValue(IsActiveProperty); }027. set { SetValue(IsActiveProperty, value); }028. }029. 030. /// <summary>031. /// Identifies the <see cref="IsActive"/> dependency property.032. /// </summary>033. public static readonly DependencyProperty IsActiveProperty =034. DependencyProperty.Register(035. "IsActive",036. typeof(bool),037. typeof(CategoryFilter),038. new System.Windows.PropertyMetadata(false));039. 040. 041. 042. 043. public bool this[string CategoryName]044. {045. get046. {047. CategoryItem item = MainCategoryList.FirstOrDefault(i => i.CategoryName == CategoryName);048. 049. if (item == null)050. throw new Exception("Category Name not found");051. 052. return (item.IsChecked);053. }054. set055. {056. CategoryItem item = MainCategoryList.FirstOrDefault(i => i.CategoryName == CategoryName);057. 058. if (item == null)059. throw new Exception("Category Name not found");060. 061. item.IsChecked = value;062. }063. }064. 065. [TypeConverter(typeof(String))]066. public List<string> Categories067. {068. get069. {070. return MainCategoryList.Where(i => i.IsChecked).Select(i => i.CategoryName).ToList();071. }072. set073. {074. foreach (CategoryItem item in MainCategoryList)075. {076. item.IsChecked = value.Contains(item.CategoryName);077. }078. }079. }080. 081. public System.Windows.Controls.ListBox CategoryList082. {083. get { return this.LstCategories; }084. }085. 086. public CategoryFilter()087. {088. InitializeComponent();089. }090. 091. public void Prepare(GridViewColumn column)092. {093. this._column = column as GridViewBoundColumnBase;094. if (this._column == null)095. {096. return;097. }098. 099. List<string> catList = ((List<EducationChoices>)(column.DataControl.ItemsSource))100. .SelectMany(l => l.CategoryList)101. .Distinct()102. .Where(l => (l ?? "")103. .Trim() != "")104. .OrderBy(c => c)105. .ToList();106. 107. MainCategoryList = catList108. .Select(i => new CategoryItem() {CategoryName = i, IsChecked = false})109. .ToList();110. 111. LstCategories.ItemsSource = MainCategoryList;112. }113. 114. private void ChangeFilter(object sender, RoutedEventArgs e) {115. BeginCategoryChange();116. 117. if (_compositeFilter != null) {118. _column.DataControl.FilterDescriptors.Remove(_compositeFilter);119. }120. _compositeFilter = new CompositeFilterDescriptor { LogicalOperator = FilterCompositionLogicalOperator.Or };121. var dataMember = _column.DataMemberBinding.Path.Path;122. 123. string Category = ((CheckBox)e.OriginalSource).Tag.ToString();124. 125. foreach (var item in MainCategoryList) {126. if (item.IsChecked) {127. var filter = new FilterDescriptor(dataMember, FilterOperator.Contains, Category);128. _compositeFilter.FilterDescriptors.Add(filter);129. }130. }131. 132. if ((((CheckBox)e.OriginalSource).IsChecked ?? false) && 133. _compositeFilter.FilterDescriptors.All(f => ((FilterDescriptor)f).Value.ToString() != Category))134. {135. var filter = new FilterDescriptor(dataMember, FilterOperator.Contains, Category);136. _compositeFilter.FilterDescriptors.Add(filter);137. } else if (!(((CheckBox) e.OriginalSource).IsChecked ?? false) &&138. _compositeFilter.FilterDescriptors.Any(f => ((FilterDescriptor) f).Value.ToString() == Category))139. {140. _compositeFilter.FilterDescriptors.Remove(141. _compositeFilter.FilterDescriptors.FirstOrDefault(142. f => ((FilterDescriptor) f).Value.ToString() == Category));143. }144. 145. 146. if (!_column.DataControl.FilterDescriptors.Contains(_compositeFilter)) {147. _column.DataControl.FilterDescriptors.Add(_compositeFilter);148. }149. 150. this.IsActive = true;151. 152. CategoryChange();153. }154.}
I found this thread and tried to figure out what it was doing, but it didn't help.