簡體   English   中英

從Android項目到ViewModel的數據綁定

[英]Data Binding from Android project to ViewModel

我正在嘗試獲取可用wifi網絡的列表,並將其顯示在列表視圖中。 在PCL項目中,我創建了一個接口“ IWifiService”。

 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);
            }
        }
    }
}

}

從ViewModel我正在像這樣調用一個依賴服務:

 var service = DependencyService.Get<IWifiService>();
        service.GetWifiList();

現在,類WifiReceiver無法返回任何內容,因此我無法在ViewModel中獲取那些網絡列表。 我如何才能將此列表放入ViewModel中?

我建議您在GetWifiList方法中返回一個List,以便界面看起來像這樣:

 public interface IWifiService
 {
    void GetWifiList(Action<List<string>> action);
 }

然后,您的GetWifiList方法將如下所示:

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;
}

然后在您的OnRecieve方法中,執行回調方法:

public override void OnReceive(Context context, Intent intent)
    {
        IList<ScanResult> scanWifiNetworks = wifi.ScanResults;
        foreach(ScanResult wifinetwork in scanWifiNetworks)
        {
            WiFiNetworks.Add(wifinetwork.Ssid);
        }
        CallBackAction(WiFiNetworks);
    }

現在,回調方法最重要的部分以及作為參數傳遞的內容:

System.Action基本上是一種方法引用,您可以在其中傳遞回調方法的名稱,如下所示:

    var service = DependencyService.Get<IWifiService>();
    service.GetWifiList(MyCallBackAction);

其中MyCallBackAction如下:

   public void MyCallBackAction(List<string> wifiNetworks)
   {
    // this method will be called every time you get a callback at OnRecieve
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM