data-binding - 我可以绑定到 Xamarin 表单中的全局内容吗?
问题描述
我想在我的大部分 ContentPage 包含的自定义视图中显示当前用户。我目前在登录后将当前用户作为属性存储在 App 实例中。尝试只更新构造函数中的标签在生命周期中为时过早。
Xamarin Forms 有没有办法绑定到这个对象,或者让当前用户在我的自定义视图中更新标签?我将 Xamarin.Forms 3.5 与标准 MVVM 一起使用。
解决方案
您可以采用多种方法,但简短的回答是,您需要在全局(静态)变量和视图之间放置一些东西,以使事情顺利进行。视图模型上的属性必须是非静态属性。
但是,它可以具有自定义实现,以便 getter 从某个全局位置检索值,在您的情况下,您可能不需要 setter。您唯一需要的另一部分是告诉视图模型在用户信息可用时触发 PropertyChanged 事件,然后您可以使用从标签到视图模型的标准绑定。
假设您有一些 CurrentUser 静态类,其成员如下:
public static class CurrentUser
{
public event Action OnLogin; // login code needs to fire this on login
public string Username { get; set; }
// etc.
}
然后视图模型将通过执行以下操作来连接到这一点:
class UserViewModel : INotifyPropertyChanged
{
public UserViewModel()
{
CurrentUser.OnLogin += CurrentUser_Login;
}
private void CurrentUser_Login()
{
PropertyChanged?.Invoke(nameof(Username));
}
public string Username {
get {
return CurrentUser.Username;
}
}
// etc.
}
然后视图将使用<Label Text="{Binding Username}" . . .>
,然后当 OnLogin 被触发时,所有视图都将使用新用户名自动更新。
推荐阅读
- xcode - 启动适用于 iOS 15 的企业应用程序时弹出“此应用程序的开发人员需要对其进行更新以使用此版本的 iOS”
- python - pandas 和 bitset 数据的性能问题
- google-bigquery - 如何在bigquery中用日语查询
- apache-flink - vm 上的 Flink v 1.13 独立设置
- python - 将列表返回到作品集中的“弹出”功能
- javascript - Spring Boot SSEEmitter 完成后发送 HttpStatus.ok
- authentication - 我启动了 FirewallD 服务但不允许 SSH 端口,现在我无法通过 SSH 登录我的虚拟机
- .net-core - ASP.Net Core Web API '无法访问此站点'
- cypress - 柏树黄瓜预处理器中的步骤定义文件夹结构
- java - vscode 中不存在包 org.junit