首页 > 解决方案 > 我可以绑定到 Xamarin 表单中的全局内容吗?

问题描述

我想在我的大部分 ContentPage 包含的自定义视图中显示当前用户。我目前在登录后将当前用户作为属性存储在 App 实例中。尝试只更新构造函数中的标签在生命周期中为时过早。

Xamarin Forms 有没有办法绑定到这个对象,或者让当前用户在我的自定义视图中更新标签?我将 Xamarin.Forms 3.5 与标准 MVVM 一起使用。

标签: data-bindingxamarin.forms

解决方案


您可以采用多种方法,但简短的回答是,您需要在全局(静态)变量和视图之间放置一些东西,以使事情顺利进行。视图模型上的属性必须是非静态属性。

但是,它可以具有自定义实现,以便 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 被触发时,所有视图都将使用新用户名自动更新。


推荐阅读