Архитектура Xamarin для обмена событиями между платформой Android и ViewModel - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть приложение, работающее на портативном компьютере Janam XT2.

У меня работает библиотека библиотеки сканеров для проекта Andriod.Я хотел быть в состоянии передать отсканированное событие в модель представления.Я не могу понять, что я делаю неправильно.

Настройка выглядит следующим образом

Использование Prism, VS 2017, MVVM.

Общий проект, содержащий классы, специфичные для штрих-кода.Совместно с проектом Android и модулем MVVM для моих данных.

У меня есть отдельный модуль MVVM для моего текущего пользовательского интерфейса.

В Android MainActivity у меня есть ссылка на экземпляр приложения, который имеетсвойство EventAggregator.Когда событие Received сканера запускается в приложении Android (MainActivity), я публикую событие ScannerEvent.

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

У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: в ответ на запрос в комментарии Нкоси.

    public ListViewBaseModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        Warehouses = new ObservableCollectionFast<WarehouseListItem>(Client.GetAsync(new WarehouseListQuery() { CompanyID = "SPF", UseBins = 1 }).Result.Results);
        _eventAggregator.GetEvent<BarcodeScannerEvent<ScanResults>>().Subscribe(BarcodeScanned);

    }


    public virtual void BarcodeScanned(ScanResults results)
    {

    }

1 Ответ

0 голосов
/ 29 ноября 2018

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

Таким образом, вы создаете событие для издателя и другое событие для подписчика (даже если они имеют одинаковое имя и выглядят одинаково).Поскольку подписчик подписывается на событие, отличное от того, которое публикует издатель, подписчик не получит его событие.

Чтобы решить эту проблему, удалите общий проект и используйте библиотеку классов.

...