【问题标题】:How to get data from Xamarin.Droid to ViewModel in Xamarin.Forms如何从 Xamarin.Droid 获取数据到 Xamarin.Forms 中的 ViewModel
【发布时间】:2018-02-19 19:34:06
【问题描述】:

我正在为一些研究制作应用程序。我正在尝试收听所有 wifi 网络,并将它们保存在数据库中。但我需要保存更多信息,然后只保存 wifi 详细信息。 我将 Xamarin Forms 用于跨平台解决方案。 我已经拥有的正在工作: - 与 ViewModel 绑定的视图。 - ViewModel 使用我在视图中创建的条目的值按预期工作。 - MySolution.Droid 项目具有访问 wifi 网络的代码。 - 我有一个接收器正在使用信息触发 OnReceive。

我所做的可能不是最佳选择: - 因为在开始扫描后,我正在等待(异步)OnReceive 触发。我选择通过 MessagingCenter 将数据发送到 ViewModel。 - 我正在成功发送信息。并在 ViewModel 中使用 MessagingCenter.Subscribe 接收它

怎么了: - 我无法获取信息(进入我的 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);
        }
    }

对于那些没有阅读上面帖子的人(例如 tldr),我在 OnReceive 中收到 ScanResult 列表,我需要它在 ViewModel 中,但我还需要其余属性。 ..

如果有更简单的方法,我会全力以赴!!!

提前致谢

【问题讨论】:

  • LocationName 为空,因为它没有在任何地方填充。您在哪里为 LocationName 赋值?
  • @Vahid,它绑定在视图中,并且它具有价值,因为有一个命令需要它不为空才能触发。如上所示,更改时是对命令的 CanExecute 的重新评估。它起作用了,让餐厅着火了。
  • @Jason,我已经删除了那部分(.....),因为这是我正在做的,并且列表包含有效数据。我,只需要访问 ViewModel 的属性。或者将此列表获取到属性具有值的线程。 (我认为...)
  • 使用调试器验证 LocationName 是否在您认为已设置时被设置
  • 没有看到更多代码,我真的不知道可能出了什么问题

标签: c# xamarin xamarin.forms xamarin.droid


【解决方案1】:

我为我的问题找到了解决方案。

这可能不是最好或最干净的方法,但它现在有效。

在 Wifi.cs 类中我填写了一个 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);
        }
    }

有了这个,我可以访问所有的信息并且属性不为空。

如果有人有更好的解决方案,我仍然全神贯注!!!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2020-06-26
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多