Навигация между ContentPages с Prism в Xamarin Forms поддерживает NavigationParameters - PullRequest
0 голосов
/ 23 октября 2018

Используя коллекцию NavigationParameters в Prism, мы передаем объект из одной ContentPage в другую ContentPage, которая отображается как модальная.

Модал позволяет пользователю редактировать данные.Если пользователь решает отменить форму редактирования, мы вызываем:

NavigationService.GoBackAsync(null, true). 

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

Передаются ли NavigationParameters в качестве ссылки в NavigateAsync?Как лучше всего предотвратить это?

1 Ответ

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

Используя коллекцию NavigationParameters в Prism, мы передаем объект [...] [Выделить мое]

Вы устанавливаете объект в NavigationParameters.Экземпляры классов (объектов) передаются по ссылке в C #, экземпляры структур передаются по значению.Для структур существует семантика для копирования и сравнения значений (т. Е. Все открытые свойства копируются и сравниваются соответственно), но для классов аналогичная семантика отсутствует.

См. Документацию :

Поскольку классы являются ссылочными типами, переменная объекта класса содержит ссылку на адрес объекта в управляемомкуча.Если второй объект того же типа назначен первому объекту, то обе переменные ссылаются на объект по этому адресу.

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

class MyClass
{
    int Value1 { get; set; }
    float Value2 { get; set; }

    public MyClass Copy()
    {
        var copy = new MyClass()
                       {
                           Value1 = this.Value1,
                           Value2 = this.Value2
                       }
        return copy;
    }
}

Если ваш объект сам содержит ссылочные типы, вам, возможно, придется создать глубокую копию

class MyClass
{
    MyClass2 Reference { get; set; }

    public MyClass Copy()
    {
        var copy = new MyClass()
                       {
                           Reference = this.Reference.Copy()
                       }
        return copy;
    }
}

Конечно, им также придется реализовать метод Copy().

...