0

私はいくつかの研究のためのアプリを作っています。すべてのwifiネットワークをリッスンして、データベースに保存しようとしています。しかし、wifi の詳細だけでなく、より多くの情報を保存する必要があります。クロス プラットフォーム ソリューションに Xamarin Forms を使用しています。私がすでに持っているものは機能しています: - ViewModel とバインドしているビュー。- ViewModel は、ビューで作成したエントリの値を使用して、予測どおりに機能しています。- プロジェクト MySolution.Droid には、wifi ネットワークにアクセスするコードがあります。- OnReceive を情報とともに起動する Receiver があります。

私がやったことは最良の選択ではないかもしれません: - スキャンを開始した後、OnReceive が起動するのを (非同期で) 待っています。MessagingCenter 経由で ViewModel にデータを送信することにしました。●無事情報をお届けしております。MessagingCenter.Subscribe を使用して ViewModel で受信する

何が問題なのですか: - (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 など)、OnReceive で ScanResult のリストを受け取っているので、それを ViewModel に含める必要がありますが、残りのプロパティも必要です...

これを行うためのより簡単な方法があれば、私はすべて耳にします!!!

前もって感謝します

4

1 に答える 1