私はいくつかの研究のためのアプリを作っています。すべての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 に含める必要がありますが、残りのプロパティも必要です...
これを行うためのより簡単な方法があれば、私はすべて耳にします!!!
前もって感謝します