Код: Выделить всё
public BindingListView Items;
public TDetailViewModel? CurrentItem;
protected PropertyInfo mDetailKeyFieldPropInfo;
private void SearchKeyFieldValue()
{
var currentFieldValue = this.mDetailKeyFieldPropInfo.GetValue(this.CurrentItem);
var originalFieldValue = this.CurrentItem.OriginalKeyFieldValue;
var foundItem = this.Items
.Where(item => item.OriginalKeyFieldValue.Equals(currentFieldValue))
.FirstOrDefault();
if (foundItem != null)
{
this.CurrentItem = foundItem;
}
else
{
mDialogService.ShowWarningMessage("Item not found.");
this.mDetailKeyFieldPropInfo.SetValue(this.CurrentItem, originalFieldValue);
}
}
Но мне нужны были возможности фильтрации и сортировки. Поэтому я создал класс BindingListView, реализующий интерфейс IBindingListView, используя следующую концепцию: когда коллекция фильтруется или сортируется, я представляю для этого ту же исходную коллекцию, но с другим представлением. Я храню список с исходными индексами объектов. Например, когда отфильтрованный и/или отсортированный список запрашивает первый элемент коллекции, он фактически указывает на шестой элемент исходной коллекции, то есть именно этот объект я возвращаю. Меня очень вдохновили FilteredBindingList и SortedBindingList из платформы CSLA .NET Rockford Lhotka. Затем я изменил тип элементов списка с BindingList на новый BindingListView.
После этого функция поиска все еще работает. Но если я фильтрую список, скажем, в списке 6 элементов, а после фильтрации в нем есть только 1 элемент, если я ищу элемент, которого нет в отфильтрованном списке, при вызове PropertyInfo.SetValue() возникает следующая ошибка. /code> для текущего элемента:
System.Reflection.TargetInvocationException: 'Исключение
вызвано цель вызова.'
Внутреннее исключение
ArgumentOutOfRangeException: rowIndex ('3') должно быть меньше '1'. Arg_ParamName_Name
ArgumentOutOfRange_ActualValue
Итак, похоже, что он работает непосредственно со списком и не может найти индекс строки. Но вот что странно: свойство CurrentItem ссылается только на тот объект, который есть в списке, поэтому я не понимаю, откуда эта попытка доступа к какому-то индексу списка.
Точно такая же проблема возникает, если я попытаюсь вместо этого использовать PropertyDescriptor.SetValue().
Что может быть причиной этого?
Подробнее здесь: https://stackoverflow.com/questions/788 ... collection
Мобильная версия