如何从 Xamarin.Droid 获取数据到 Xamarin.Forms 中的 ViewModel
How to get data from Xamarin.Droid to ViewModel in Xamarin.Forms
我正在为一些研究制作一个应用程序。我正在尝试收听所有 wifi 网络,并将它们保存在数据库中。但我需要保存更多信息,然后只保存 wifi 详细信息。
我将 Xamarin Forms 用于跨平台解决方案。
我已经拥有的正在运行:
- 与 ViewModel 绑定的视图。
- ViewModel 按预期工作,使用我在视图中创建的条目的值。
- 项目 MySolution.Droid 有访问 wifi 网络的代码。
- 我有一个接收器正在使用信息触发 OnReceive。
我所做的可能不是最好的选择:
- 因为在开始扫描后,我正在等待(异步)OnReceive 触发。我选择通过 MessagingCenter 将数据发送到 ViewModel。
- 我正在成功发送信息。并使用 MessagingCenter.Subscribe
在 ViewModel 中接收它
怎么了:
- 我无法获取信息(进入我的 ViewModel),ViewModel 的每个 属性 都是空的。
- 我想要的是将信息获取到 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);
}
}
对于那些没有阅读上面 post 的人(比如,tldr),我在 OnReceive 中收到 ScanResult 列表,我需要它在 ViewModel 中,但我还需要其余属性...
如果有更简单的方法,我洗耳恭听!!!
提前致谢
我找到了解决问题的方法。
这可能不是最好或最干净的方法,但它现在有效。
在Wifi.csclass我填一个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);
}
}
有了这个,我可以访问所有信息并且属性不为空。
如果有人有更好的解决方案,我仍然洗耳恭听!!!!!
我正在为一些研究制作一个应用程序。我正在尝试收听所有 wifi 网络,并将它们保存在数据库中。但我需要保存更多信息,然后只保存 wifi 详细信息。 我将 Xamarin Forms 用于跨平台解决方案。 我已经拥有的正在运行: - 与 ViewModel 绑定的视图。 - ViewModel 按预期工作,使用我在视图中创建的条目的值。 - 项目 MySolution.Droid 有访问 wifi 网络的代码。 - 我有一个接收器正在使用信息触发 OnReceive。
我所做的可能不是最好的选择: - 因为在开始扫描后,我正在等待(异步)OnReceive 触发。我选择通过 MessagingCenter 将数据发送到 ViewModel。 - 我正在成功发送信息。并使用 MessagingCenter.Subscribe
在 ViewModel 中接收它怎么了: - 我无法获取信息(进入我的 ViewModel),ViewModel 的每个 属性 都是空的。 - 我想要的是将信息获取到 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);
}
}
对于那些没有阅读上面 post 的人(比如,tldr),我在 OnReceive 中收到 ScanResult 列表,我需要它在 ViewModel 中,但我还需要其余属性...
如果有更简单的方法,我洗耳恭听!!!
提前致谢
我找到了解决问题的方法。
这可能不是最好或最干净的方法,但它现在有效。
在Wifi.csclass我填一个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);
}
}
有了这个,我可以访问所有信息并且属性不为空。
如果有人有更好的解决方案,我仍然洗耳恭听!!!!!