如何在Xamarin.Forms

时间:2018-02-19 19:34:06

标签: c# xamarin xamarin.forms xamarin.droid

我正在为一些研究制作应用。我试图收听所有的wifi网络,并将它们保存在数据库中。但我需要保存更多信息,然后只是wifi细节。 我使用Xamarin Forms作为跨平台解决方案。 我已经拥有的工作:      - 与ViewModel绑定的视图。      - ViewModel正如预测的那样工作,具有我在视图中创建的条目的值。      - 项目MySolution.Droid具有访问wifi网络的代码。      - 我有一个接收器正在向OnReceive发送信息。

我所做的可能不是最佳选择:      - 自从开始扫描后,我等待(异步)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中,但我还需要其余的属性......

如果有更简单的方法,我全都是耳朵!

提前致谢

1 个答案:

答案 0 :(得分:1)

解决方案我发现了我的问题。

它可能不是最好或最干净的方法,但它现在有效。

在Wifi.cs类中,我填写了一个List

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

有了这个,我可以访问所有信息,而且属性不是空的。

如果有人有更好的解决方案,我仍然都是耳朵!!!!!