2017-01-17 9 views
0

У меня есть datagrid, чьи объекты source я устанавливаю как «DefaultView», который является dataview.Фильтрация WPF Datagrid с DataTable как его Itemssource вызывает исключение

У меня есть текстовое поле на странице для фильтрации. Когда я ввожу текст в текстовое поле, я обновляю «Фильтр» datagrid, но он бросает NotSupportedException «Указанный метод не поддерживается». Я не совсем уверен, что я делаю неправильно.

Вот мой код, где я создать DataTable:

var dt = new DataTable(); 
     templates[0].FieldList[0].Items.Sort(); 

     foreach (var tag in templates[0].FieldList[0].Items) 
     { 
      DataColumn col = new DataColumn() { ColumnName = tag.Name }; 
      dt.Columns.Add(col); 
     } 

     foreach (var temp in templates) 
     { 
      DataRow row = dt.NewRow(); 

      foreach (var tag in temp.FieldList[0].Items) 
      { 
       if (dt.Columns.Contains(tag.Name)) 
        row[tag.Name] = tag.TagValue; 
      } 
      dt.Rows.Add(row); 
     } 

     return dt; 

Тогда я просто установить свойство ItemsSource сетки для этого DataTable в «DefaultView»

Вот где я поставил фильтр на сетке:

private void SearchText_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     LookUpDataGrid.Items.Filter = TextFilter; 
    } 

Тогда вот "TextFilter" метод:

private bool TextFilter(object o) 
    { 
     if (o.GetType().Equals(typeof(ExpandoObject))) 
     { 
      var row = o as IDictionary<string, object>; 
      foreach (var v in row.Values) 
      { 
       if (v.ToString().ToLower().Contains(SearchText.Text.ToLower())) 
        return true; 
      } 
     } 

     string[] propertyNames = o.GetType().GetProperties().Where(p => p.PropertyType.Name == "String").Select(p => p.Name).ToArray(); 
     return propertyNames.Any(p => ((string)o.GetType().GetProperty(p).GetValue(o, null)).ToLower().Contains(SearchText.Text.ToLower())); 
    } 
+1

[docs] (https://msdn.microsoft.com/en-us/library/system.windows.controls.itemcollection.filter (v = vs.110) .aspx) говорит об этом * Используйте свойство CanFilter чтобы проверить, поддерживает ли текущая реализация фильтрацию, прежде чем назначать это свойство с ненулевым значением. * Предполагая, что не все, к чему вы можете привязать, является фильтруемым. –

+0

Я просто добавил, что до установки фильтра на textchanged и вы правы. Это ложь". Итак, похоже, что я, вероятно, должен попытаться создать динамический объект на основе элементов и сложного свойства «FieldList», а затем привязать к этой коллекции, а не создавать datatable. –

+0

вы можете посмотреть на collectionviewsource –

ответ

0

Вы не можете зарегистрировать DataTable, используя свойство Filter для интерфейса ICollectionView. Вместо этого следует использовать свойство RowFilter в DataView и т.д .:

DataView dv = LookUpDataGrid.ItemsSource as DataView; 
if(dv != null) 
{ 
    dv.RowFilter = "n = 1"; //where n is a column name of the DataTable 
} 

Также тип элемента в DataView никогда не является ExpandoObject. Это всегда DataRowView, поэтому реализация вашего метода TextFilter не будет работать.

Возможно, вам следует рассмотреть возможность установки ItemsSource на что-то другое, чем DataView, например IEnumerable<ExpandoObject>.