У меня есть небольшой проект, который содержит несколько страниц, все из которых ссылаются на Список источников истины в классе 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());
});
но сообщение об отладке не запускается при отправке сообщения. Любое понимание этой новой разработки?