簡體   English   中英

如何在Xamarin.Forms中將數據從Xamarin.Droid獲取到ViewModel

[英]How to get data from Xamarin.Droid to ViewModel in Xamarin.Forms

我正在為一些研究開發應用程序。 我正在嘗試收聽所有wifi網絡,並將它們保存在數據庫中。 但是我需要保存更多信息,然后僅保存wifi詳細信息。 我將Xamarin Forms用於跨平台解決方案。 我已經擁有的可以正常工作:-與ViewModel綁定的View。 -ViewModel與我在View中創建的條目的值一樣,按預期工作。 -項目MySolution.Droid具有訪問wifi網絡的代碼。 -我有一個正在使用該信息觸發OnReceive的Receiver。

我所做的可能不是最好的選擇:-自從開始掃描后,我一直在等待(異步)觸發OnReceive。 我選擇通過MessagingCenter將數據發送到ViewModel。 -我正在成功發送信息。 並使用MessagingCenter.Subscribe在ViewModel中接收它

怎么了:-我無法獲取信息(進入ViewModel),ViewModel擁有的每個屬性都為null。 -我想要的只是將信息獲取到ViewModel。 或者,如果我只能在BeginInvokeOnMainThread中獲取綁定到View的信息,那么該工作就很好了。

我擁有的代碼:

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),我在OnReceive中收到ScanResult的列表,我需要將其包含在ViewModel中,但是我還需要其余的屬性...

如果有更簡單的方法可以做到,我全都可以聽到!!!

提前致謝

解決方案我找到了我的問題。

這樣做可能不是最好或最干凈的方法,但目前仍然有效。

在Wifi.cs類中,我填寫一個列表

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

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

我定期從ViewModel中使用Get方法獲取列表,如下所示:

    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);
        }
    }

這樣,我可以訪問所有信息,並且屬性不為空。

如果有人有更好的解決方案,我還是會聽!!!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM