Как получить данные из Xamarin.Droid в ViewModel в Xamarin.Forms

Я делаю приложение для некоторых исследований. Я пытаюсь прослушать все сети Wi-Fi и сохранить их в базе данных. Но мне нужно сохранить больше информации, чем просто детали Wi-Fi. Я использую Xamarin Forms для кроссплатформенного решения. То, что у меня уже есть, работает: - Вид, связанный с ViewModel. - ViewModel работает в соответствии с прогнозом, со значениями записей, которые я создал в View. - Проект MySolution.Droid имеет код для доступа к сетям Wi-Fi. - У меня есть приемник, который запускает OnReceive с информацией.

То, что я сделал, может быть не лучшим выбором: - Поскольку после запуска сканирования я жду (асинхронно) срабатывания OnReceive. Я решил отправить данные в ViewModel через MessagingCenter. - Я с успехом отправляю информацию. И получать его в ViewModel с MessagingCenter. Подписка

Что не так: - Я не могу вывести информацию (в мою ViewModel), каждое свойство, которое имеет ViewModel, имеет значение null. - Я хотел бы просто получить информацию для ViewModel. Или, если бы я мог просто получить информацию о привязке к представлению в BeginInvokeOnMainThread, эта работа будет работать нормально.

Код, который у меня есть:

ScanViewModel.cs:

    string locationName;
    public string LocationName
    {
        get
        {
            return locationName;
        }
        set
        {
            if (locationName != value)
            {
                locationName = value;
                OnPropertyChanged();
                StartScanCommand.ChangeCanExecute();
            }
        }
    }
    public ScanViewModel()
        {
        MessagingCenter.Subscribe<IScanReceiver, List<ScanResult>>(this, "receiveWiFiNetworks", (sender, arg) =>
            {
                Device.BeginInvokeOnMainThread(
                async () =>
                {
                    var l = LocationName // THIS IS NULL
                    ......
                }
                );
            });
    }

App.Droid.Wifi.cs:

    public void GetWifiNetworks()
    {
        WiFiNetworks = new List<ScanResult>();

        wifi = (WifiManager)context.GetSystemService(Context.WifiService);

        wifiReceiver = new WifiReceiver();
        context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
        wifi.StartScan();
    }

    class WifiReceiver : BroadcastReceiver, IScanReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            List<ScanResult> scanwifinetworks = wifi.ScanResults.ToList();

            MessagingCenter.Send<IScanReceiver, List<ScanResult>>(this, "receiveWiFiNetworks", scanwifinetworks);
        }
    }

Для тех, кто не читал пост выше (например, tldr), я получаю список ScanResult в OnReceive, и мне нужно, чтобы он был в ViewModel, но мне также нужны остальные свойства...

Если есть более простой способ сделать это, я все уши!!!

заранее спасибо

1 ответ

Решение

Решение, которое я нашел для моей проблемы.

Это может быть не самый лучший или самый чистый способ сделать это, но пока это работает.

В классе Wifi.cs я заполняю список

    public List<ScanResult> GetWifiNetworks(){
        return WiFiNetworks;
    }

    class WifiReceiver : BroadcastReceiver, IScanReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            WiFiNetworks = wifi.ScanResults.ToList();
        }
    }

И я периодически получаю список с методом Get из ViewModel следующим образом:

    void StartScan()
    {
        Timer _wifiAsyncTimer = new Timer();
        _wifiAsyncTimer.Elapsed += GetWifiNetworks;
        _wifiAsyncTimer.Interval = ListenPeriodicity * 1000;
        _wifiAsyncTimer.Enabled = true;
    }

    private void GetWifiNetworks(object source, ElapsedEventArgs e)
    {
        var wifiNetworks = _wifiManager.GetWifiNetworks();
        if (wifiNetworks.Count > 0)
        {
            LocationInformation LocationInformation = new LocationInformation()
            {
                LocationName = LocationName,
                Temperature = Temperature,
                Notes = Notes,
                Timestamp = DateTime.Now
            };
            LocationInformations = LocationInformation.AddWifiInformation(wifiNetworks);
        }
    }

С этим я могу получить доступ ко всей информации, и свойства не равны нулю.

Если у кого-то есть лучшее решение, я все еще уши!!!!!

Другие вопросы по тегам