Установка значения свойства посредством отражения объекта, на который ссылается коллекция, с другим представлением, вызыC#

Место общения программистов C#
Ответить
Anonymous
 Установка значения свойства посредством отражения объекта, на который ссылается коллекция, с другим представлением, вызы

Сообщение Anonymous »

Я использовал BindingList в своей ViewModel, в шаблоне MVVM с Windows Forms в .NET 8.0, а затем создал общую функцию, которая извлекала ключевое поле в списке. Поскольку я использую одно и то же свойство для редактирования и получения значения ключевого поля, если элемент не найден, я восстанавливаю исходное значение ключевого поля и для этого использую отражение, вызывая PropertyInfo.SetValue() для текущего элемента:

Код: Выделить всё

   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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»