Изменения свойств внутри MessagingCenter.Subscribe не отражаются вне метода - PullRequest
1 голос
/ 18 июня 2020

Я использую аргумент, переданный с использованием MessagingCenter.Subscribe, чтобы изменить свойство Name, но вне метода MessagingCenter.Subscribe изменение не отражается, и свойство остается с нулевым значением.

Я думаю, что MessagingCenter.Subscribe создает отдельный экземпляр свойства, но я не знаю, как решить эту проблему, если это так.

Отправка сообщения

            ClassPageViewModel classPageViewModel = new ClassPageViewModel();

            MessagingCenter.Send<MainPage, ClassListModel>(this, "ClassDetails", details);

Получение сообщения

        public string Name { get; set; } 

        public ClassPageViewModel()
        {
            MessagingCenter.Subscribe<MainPage, ClassListModel>(this, "ClassDetails", (sender, arg) =>
            {
                Name = arg.Name;
                Console.WriteLine(Name); //This outputs what I sent
            });

            Console.WriteLine(Name); //This outputs a null value

        }

Имя должно быть свойством, поскольку оно привязано к метке

и Я не могу использовать аргумент конструктора страницы для передачи строки.

--------- Изменить ---------

Создание второго экземпляра на второй странице ( первый экземпляр отправлял сообщение)

BindingContext = new ClassPageViewModel();

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Конечно, будет выведено значение null. Значение по умолчанию string - null. Вы никогда не инициализировали свое свойство Name. Он будет инициализирован , как только подписчик (то есть страница) получит сообщение. В вашем ctor вы просто подписываетесь на topi c, но ничего не получаете (по крайней мере, при самой инициализации). Если вы вызовете метод WriteLine после того, как отправите topi c, вы увидите, что свойство будет иметь обновленное значение.

Если вы действительно должны использовать MessagingCenter, то лучший подход - инициализировать свойство Name, чтобы оно было string.Empty, чтобы некоторая привязка не вызывала исключения. И позже, когда MessagingCenter отправит сообщение, значение изменится само.

NB: имейте в виду, что вам нужно будет позвонить OnPropertyChanged, чтобы пользовательский интерфейс знал, что свойство Name требует перерисовки.

0 голосов
/ 19 июня 2020
public string Name { get; set; } 

public ClassPageViewModel()
{
    MessagingCenter.Subscribe<MainPage, ClassListModel>(this, "ClassDetails", (sender, arg) =>
    {
        Name = arg.Name;
        //first line
        Console.WriteLine(Name); //This outputs what I sent
    });

    //second line
    Console.WriteLine(Name); //This outputs a null value

}

Думаю, вы сначала поймете, когда будут напечатаны эти две строки.

Код первой строки будет выполняться, когда вы отправляете ClassDetails сообщение от MessagingCenter.

Код второй строки будет выполнен, когда вы создадите новый экземпляр ClassPageViewModel.

Итак, возвращаясь к вашему вопросу:

вне метода MessagingCenter.Subscribe, изменение не отражается, и свойство остается на нулевом значении.

В это время вы просто создаете новый экземпляр ClassPageViewModel, поэтому вы получаете null из кода второй строки.

Вторая строка записи запускается дважды.

Это должно быть вызвано тем, что вы создали два экземпляра ClassPageViewModel.

, тогда как мне сохранить обе страницы используя тот же экземпляр

Есть много способов добиться этого. Вот что я рекомендую вам сделать:

В классе App создайте свойство stati c с именем classPageVM и настройте classPageVM там:

public partial class App : Application
{
    public static ClassPageViewModel classPageVM { get; set; }

    public App()
    {
        InitializeComponent();

        //custom your classPageVM herer
        classPageVM = new ClassPageViewModel();

        MainPage = new MainPage();
    }
}

Затем на странице, на которой вы хотите использовать эту модель просмотра, вы можете использовать тот же экземпляр App.classPageVM:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

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