Я связываю данные ListView с коллекцией, которая происходит из сервисного уровня.В ответ на события модель представления, связанная с ListView, обновляет данные ListView.Чтобы получить обновленные данные, виртуальная машина извлекает новый экземпляр коллекции из сервисного уровня.Элементами в этой коллекции являются Equals (), но не ReferenceEquals () для эквивалентных элементов в ранее возвращенной коллекции.
Можете ли вы порекомендовать подход, который позволяет избежать недостатков подходов, указанных ниже, но при этом позволяет виртуальной машине включатьэти данные в ListView, не заставляя ListView потерять свой SelectedItem?
Спасибо,
Бен
Простой подход (просмотр кода модели; SelectedItem и ItemsSource ListView привязаны к идентично связанным свойствам в виртуальной машине):
var selectedItem = SelectedItem;
ItemsSource = service.GetData();
SelectedItem = Accounts.SingleOrDefault(x => x.Equals(selectedItem));
Этот подход кажется безобразным.Сюда также входит сброс SelectedItem - потенциальная проблема, если изменение SelectedItem приводит к изменению редактирования детали в форме основной детали.(Установка ItemsSource приводит к очистке SelectedItem, поэтому он переустанавливается в последней строке.)
Другой подход - написание адаптера, который загружает ObservableCollection <> с прокси-объектами, указывающими на данные, возвращаемые изначальный вызов уровня обслуживания.Каждый раз, когда обновленные данные извлекаются из сервисного уровня, прокси-объекты обновляются, чтобы указывать на вновь полученные объекты.Таким образом, нет необходимости сбрасывать ListSource ItemsSource для обновления ListView (он остается связанным с тем же ObservableCollection <>), что означает, что SelectedItem не будет сброшен.Недостатком этого подхода является количество кода.