У меня есть 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()));
}
[docs] (https://msdn.microsoft.com/en-us/library/system.windows.controls.itemcollection.filter (v = vs.110) .aspx) говорит об этом * Используйте свойство CanFilter чтобы проверить, поддерживает ли текущая реализация фильтрацию, прежде чем назначать это свойство с ненулевым значением. * Предполагая, что не все, к чему вы можете привязать, является фильтруемым. –
Я просто добавил, что до установки фильтра на textchanged и вы правы. Это ложь". Итак, похоже, что я, вероятно, должен попытаться создать динамический объект на основе элементов и сложного свойства «FieldList», а затем привязать к этой коллекции, а не создавать datatable. –
вы можете посмотреть на collectionviewsource –