从Android项目到ViewModel的数据绑定
我正在尝试获取可用wifi网络的列表,并将其显示在列表视图中。在PCL项目中,我创建了一个接口“IWifiService”从Android项目到ViewModel的数据绑定,android,xamarin,data-binding,xamarin.forms,Android,Xamarin,Data Binding,Xamarin.forms,我正在尝试获取可用wifi网络的列表,并将其显示在列表视图中。在PCL项目中,我创建了一个接口“IWifiService” public interface IWifiService { void GetWifiList(); } 在android项目中,一个类WifiService用于获取所有网络列表 [assembly:Dependency(typeof(WifiService))] namespace WifiConnectivity.Droid.WifiService { p
public interface IWifiService
{
void GetWifiList();
}
在android项目中,一个类WifiService用于获取所有网络列表
[assembly:Dependency(typeof(WifiService))]
namespace WifiConnectivity.Droid.WifiService
{
public class WifiService : IWifiService
{
private static WifiManager wifi;
private WifiReceiver wifiReceiver;
public static List<string> WiFiNetworks;
public void GetWifiList()
{
WiFiNetworks = new List<string>();
var context = Android.App.Application.Context;
wifi = (WifiManager)context.GetSystemService(Context.WifiService);
wifiReceiver = new WifiReceiver();
context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
}
public class WifiReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
IList<ScanResult> scanWifiNetworks = wifi.ScanResults;
foreach(ScanResult wifinetwork in scanWifiNetworks)
{
WiFiNetworks.Add(wifinetwork.Ssid);
}
}
}
}
[程序集:依赖项(typeof(WifiService))]
命名空间WifiConnectivity.Droid.WifiService
{
公共类WifiService:IWifiService
{
专用静态WifiManager-wifi;
私人WifiReceiver WifiReceiver;
公共静态列表WiFiNetworks;
公共无效GetWifiList()
{
WiFiNetworks=新列表();
var context=Android.App.Application.context;
wifi=(WifiManager)context.GetSystemService(context.WifiService);
wifiReceiver=新的wifiReceiver();
RegisterReceiver(wifiReceiver,新的IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
}
公共类WifiReceiver:BroadcastReceiver
{
公共覆盖void OnReceive(上下文、意图)
{
IList scanWifiNetworks=wifi.ScanResults;
foreach(scanWifiNetworks中的ScanResult WifineTworks)
{
添加(wifinetwork.Ssid);
}
}
}
}
}
在ViewModel中,我调用的依赖项服务如下:
var service = DependencyService.Get<IWifiService>();
service.GetWifiList();
public interface IWifiService
{
void GetWifiList(Action<List<string>> action);
}
public static Action<List<string>> CallBackAction;
public void GetWifiList(Action<List<string>> callBackMethod)
{
WiFiNetworks = new List<string>();
var context = Android.App.Application.Context;
wifi = (WifiManager)context.GetSystemService(Context.WifiService);
wifiReceiver = new WifiReceiver();
context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
CallBackAction= callBackMethod;
}
var service=DependencyService.Get();
service.GetWifiList();
现在WifiReceiver类无法返回任何内容,因此我无法在ViewModel中获取这些网络列表。如何将此列表放入我的ViewModel?我建议您在GetWifiList方法中返回一个列表,这样界面看起来像这样:
var service = DependencyService.Get<IWifiService>();
service.GetWifiList();
public interface IWifiService
{
void GetWifiList(Action<List<string>> action);
}
public static Action<List<string>> CallBackAction;
public void GetWifiList(Action<List<string>> callBackMethod)
{
WiFiNetworks = new List<string>();
var context = Android.App.Application.Context;
wifi = (WifiManager)context.GetSystemService(Context.WifiService);
wifiReceiver = new WifiReceiver();
context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
CallBackAction= callBackMethod;
}
公共接口IWifiService
{
作废GetWifiList(行动);
}
然后您的GetWifiList方法将如下所示:
var service = DependencyService.Get<IWifiService>();
service.GetWifiList();
public interface IWifiService
{
void GetWifiList(Action<List<string>> action);
}
public static Action<List<string>> CallBackAction;
public void GetWifiList(Action<List<string>> callBackMethod)
{
WiFiNetworks = new List<string>();
var context = Android.App.Application.Context;
wifi = (WifiManager)context.GetSystemService(Context.WifiService);
wifiReceiver = new WifiReceiver();
context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
CallBackAction= callBackMethod;
}
公共静态动作回调动作;
public void GetWifiList(Action callBackMethod)
{
WiFiNetworks=新列表();
var context=Android.App.Application.context;
wifi=(WifiManager)context.GetSystemService(context.WifiService);
wifiReceiver=新的wifiReceiver();
RegisterReceiver(wifiReceiver,新的IntentFilter(WifiManager.ScanResultsAvailableAction));
wifi.StartScan();
CallBackAction=callBackMethod;
}
然后在OnReceive方法中,执行回调方法:
public override void OnReceive(Context context, Intent intent)
{
IList<ScanResult> scanWifiNetworks = wifi.ScanResults;
foreach(ScanResult wifinetwork in scanWifiNetworks)
{
WiFiNetworks.Add(wifinetwork.Ssid);
}
CallBackAction(WiFiNetworks);
}
public override void OnReceive(上下文、意图)
{
IList scanWifiNetworks=wifi.ScanResults;
foreach(scanWifiNetworks中的ScanResult WifineTworks)
{
添加(wifinetwork.Ssid);
}
回调操作(WiFiNetworks);
}
现在是回调方法最重要的部分,以及作为参数传递的内容:
System.Action基本上是一个方法引用,您可以在其中传递回调方法的名称,如下所示:
var service = DependencyService.Get<IWifiService>();
service.GetWifiList(MyCallBackAction);
var service=DependencyService.Get();
GetWifiList(MyCallBackAction);
其中MyCallBackAction如下所示:
public void MyCallBackAction(List<string> wifiNetworks)
{
// this method will be called every time you get a callback at OnRecieve
}
public void MyCallBackAction(列出wifiNetworks)
{
//每次在OnReceive获得回调时都会调用此方法
}
不会,因为您在IWifiService
中有void
返回类型。仅供参考:WifiManager.StartScan()在Pie中已被弃用…谢谢@G.hakim我将尝试此方法。如果可以的话,请告诉你。当然,请告诉我