![](/img/trans.png)
[英]Xamarin.Forms: ListView are not being Displayed on Xamarin.Droid
[英]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.