Как указать отправителя в MessagingCenter.Send, если отправителем является класс stati c или объект в классе stati c? - PullRequest
0 голосов
/ 16 января 2020

У меня есть небольшой проект, который содержит несколько страниц, все из которых ссылаются на Список источников истины в классе c. Этот список c периодически обновляется с использованием HTTPRequests. Я пытаюсь использовать Messaging Center для обновления ObservableCollection на каждой странице ViewModels всякий раз, когда происходит обновление, но у меня возникают проблемы с выяснением, как заставить это работать.

В классе stati c я Я попытался настроить операцию MessagingCenter.Send () с отправителем из списка источников правды, поскольку я могу сам указать класс в качестве отправителя (ключевое слово 'this' недопустимо в свойстве stati c). .). Я также отправляю список источников истины в качестве аргумента. Я не уверен, что это действительно так, но пока не получаю никаких ошибок и пока не смог проверить его функциональность, запустив его. Вот соответствующий код из моего класса c:

using MyApp.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Xamarin.Forms;

namespace MyApp.Services
{
    public static class MyListDataService
    {
        //The List
        private static ObservableCollection<ListItem> myList = new ObservableCollection<ListItem>();

        //Static Method for getting the list from another place
        public static ObservableCollection<ListItem> GetItems()
        {
            return myList;
        }

        //Method that updates the List
        public static async System.Threading.Tasks.Task<bool> RequestUpdatedListAsync()
        {

            // HTTPRequest code that updates local List...

            MessagingCenter.Send(myList, Constants._listUpdateContract, myList);

            return success;
        }
    }
}

Подписка происходит в ViewModel моей ListPage примерно так:

using MyApp.Models;
using MyApp.Services;
using MyApp.Views;
using System.Collections.ObjectModel;
using Xamarin.Forms;
using MvvmHelpers;

namespace MyApp.ViewModels
{
    public class ListPageViewModel
    {
        public ObservableRangeCollection<ListItem> MyList { get; private set; } = new ObservableRangeCollection<ListItem>(); 
        INavigation Navigation;

        public ListPageViewModel(INavigation MyListNavigation)
        {
            Navigation = MyListNavigation;

            MessagingCenter.Subscribe<MyListDataService.myList, ObservableCollection<ListItem>>(this, Constants._listUpdateContract, (s, a) =>
            {
                //populate list code
            });

        }
    }
}

Я попытался сделать MyListDataService. myList публикует c и ссылается на объект MyListDataService.myList в качестве спецификации получающего отправителя, но когда я это делаю, я получаю сообщение об ошибке: «Имя типа« myList »не существует в типе« MyListDataService ». И даже если оно сработало, я не знаю, должен ли я в любом случае опубликовать этот список c. Каков будет правильный способ сделать это? Что я должен указать в качестве отправителя в этом случае? Может ли это даже работать?

ОБНОВЛЕНИЕ: мне удалось получить код для компиляции, заменив

MessagingCenter.Send(myList, Constants._listUpdateContract, myList);

на

MessagingCenter.Send(Application.Current, Constants._listUpdateContract, myList);

и заменив

MessagingCenter.Subscribe<MyListDataService.myList, ObservableCollection<ListItem>>(this, Constants._listUpdateContract, (s, a) =>
            {
                //populate list code
            });

на

            MessagingCenter.Subscribe<App, ObservableCollection<ListItem>>(Application.Current, Constants._listUpdateContract, (s, a) =>
            {
                //populate list code
                System.Diagnostics.Debug.WriteLine(a.ToString());
            });

но сообщение об отладке не запускается при отправке сообщения. Любое понимание этой новой разработки?

1 Ответ

2 голосов
/ 16 января 2020

Send и Subscribe необходимо использовать одинаковые параметры типа

MessagingCenter.Send<object,ObservableCollection<ListItem>>(Application.Current, Constants._listUpdateContract, myList);

MessagingCenter.Subscribe<object, ObservableCollection<ListItem>>(Application.Current, Constants._listUpdateContract, (s, a) =>
        {
            //populate list code
            System.Diagnostics.Debug.WriteLine(a.ToString());
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...