c# - 在 Xamarin 中的 UI 和代码模块之间传递值的最佳方式
问题描述
我正在为 Android 和 IOS 的 Xamarin 创建一个跨平台应用程序。该应用需要返回设备的位置(经度、纬度、地址的第一行)它还需要从 Mifare Ultralight Fobs 中读取特定数据。当出现“Admin Fob”时,应用程序将切换到写入模式,允许用户为其他用户编程 Fobs。我已经解决了基本问题,因为我可以获得地址详细信息并将数据读/写到 Fob。
随着 Xamarin 的不断发展,我想知道在 UI 和底层代码模块之间来回传递信息的最佳方法是什么。
似乎有 1) 使用静态变量 2) 依赖注入 3) 消息中心
我对 Xamarin 也很陌生。
解决方案
静态变量不是 UI 值的好选择,除非您知道自己在做什么。
最简单的方法就像@MindSwipe 所说的 MVVM 模式。创建一个简单的 ViewModel,将其设置为 BindingContext 并在 XAML 中使用 Binding。它与 WPF 基本相同,因此您可以使用许多适用于 Xamarin 的 WPF 指南。
这是一个简单的例子:
public class MyViewPage : ContentPage
{
MyVieModel ViewModel = null;
public MyViewPage(){
this.BindingContext = ViewModel = new MyViewModel();
}
}
视图模型:
public class MyViewModel : INotifyPropertyChanged
{
private int _Counter = 0;
public int Counter
{
get { return _Counter; }
set
{
_Counter = value;
OnPropertyChanged(nameof(Counter));
}
}
}
在 XAML 上只是简单的绑定:
<Label Text="{Binding Counter}" />
默认情况下,绑定与双向绑定一起使用,因此当您设置计数器时,UI 会立即更新。
推荐阅读
- javascript - JavaScript Date timezone date before 1970 - 1906-01-02 在此之前工作不工作
- calayer - 带有 CALayer 子类的 NSView makeBackingLayer 不显示输出
- angular - 如何在Angular中将一个formGroup复制到另一个?
- database - Oracle中如何查看授予用户的表列
- php - Shared memory and Cloudfoundry container issue with php exec using boost interprocess library
- sql - Fastest way to update a large table from another (large) table?
- firebase - Cloud Storage for Firebase 安全规则:如果文件夹存在则允许写入
- mongodb - 通过 debezium mongodb 连接器连接到 mongodb 时身份验证失败
- javascript - Chrome 中的警报框性能
- java - Microprofile - 无效的 HTTP 方法:PATCH