Создайте копию коллекции ObservableCollection, которая не обновляется - PullRequest
0 голосов
/ 24 октября 2018

Я создаю элемент управления в формах xamarin, который привязывается к списку объектов.Чтобы заставить эту привязку работать, мне нужно использовать наблюдаемые коллекции (в противном случае методы с измененным свойством не срабатывают).

Я заметил действительно расстраивающее взаимодействие в результате необходимости использовать OC вместо списков.Всякий раз, когда обновляется связанный OC, значения в моих элементах управления автоматически обновляются, даже если они являются просто ссылками на OC. Вот как я копирую OC.

//Internal list of events
private List<EventItem> _events;

void OnEventsChanged(ObservableCollection<EventItem> eventsCollection)
{
    //Error handle

    List<EventItem> events = eventsCollection.ToList();

    //Do something

    _events = events;
}

Проблема возникает при обновлении OCЯ хочу проверить новые / удаленные И измененные объекты.Проблема в том, что при обновлении OC также обновляется внутренний список (_events).Это означает, что когда я делаю сравнение между старыми и новыми значениями, они совпадают.

Честно говоря, я не очень понимаю, как c # обрабатывает копирование ссылок на объекты вокруг, у меня была похожая проблема некоторое время назадпри вычислении DateTime.Now в отличие от копирования значения уже инициализированного объекта.

var time = DateTime.Now;

await Task.Delay(1000);

var time2 = time; //This is 1 second later than time, not the value of time (which is what I wanted)

Я использовал Objective-C в прошлом, и у него есть концепция MutableCopy, где вы можете назначитьновый список из существующего, они имеют те же значения, но не связаны между собой.

Как я могу сделать это в C #, чтобы мой внутренний список элементов управления обновлялся только мной, а не OC?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Это совершенно нормально.Если у меня будет достаточно времени, я постараюсь объяснить это вам.

В двух словах, observableList (или Список) - это список ссылок на объекты, а не список объектов.Дело в том, что объекты не копируются внутри списка, а список содержит ссылку на разные объекты.Это означает, что если вы сделаете что-то вроде ToList(), вы получите другой список ссылок на точно такие же объекты.

Теперь, чтобы решить вашу проблему.Просто создайте новый список с новыми объектами с чем-то вроде

var newList = oldList.Select(x => new Model(x)).ToList();

И, конечно, класс Model имеет конструктор, который принимает Model в качестве параметра и копирует свойства.

0 голосов
/ 24 октября 2018

Когда вы пишете _events = events;, вы создаете не новый объект, а ссылку для того же объекта.https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/index.Вы должны клонировать (создать копию самого объекта), как упомянуто в комментарии @ Matt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...