2

我正在使用 PRISM 库为 MVVM 架构开发 Xamarin.Forms。

所以,问题是每当我使用 INavigationService 在页面之间导航时,类/ViewModel 总是新实例化,因此已经分配的字符串变为空/null。我正在 App.Xaml.cs 中注册页面和 ViewModel,如下所示:

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<LoginPage, LoginViewModel>();
}

如何处理在整个应用程序工作期间不总是新实例化或只需要实例化一次。

4

1 回答 1

1

由于各种原因,您尝试执行的操作不受支持。可以说 Singleton ViewModel 是一种非常糟糕的做法并且会导致很多问题。虽然我们无法阻止您将 ViewModel 注册为容器中的单例,但这会在您的应用程序中引入错误。

适当的方式

您还没有真正提供有关您要实例化的内容的任何详细信息,但是其中一种方法应该适合您。

使用 IInitialize 或 INavigationAware.OnNavigatedTo

public class LoginViewModel : IInitialize
{
    public void Initialize(INavigationParameters parameters)
    {
        // Initialize anything you need to for the life cycle of your ViewModel here
    }
}

使用单例服务

public class SomeService : ISomeService
{
    public string Username { get; set; }
}

public partial class App : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<LoginPage, LoginViewModel>();
        containerRegistry.RegisterSingleton<ISomeService, SomeService>();
    }
}

public class LoginViewModel
{
    private ISomeService _someService { get; }

    public LoginViewModel(ISomeService someService)
    {
        _someService = someService;
        UserName = _someService.UserName;
    }

    // simplified for example
    public string UserName { get; set; }

    private void DoLogin()
    {
        _someService.UserName = UserName;

    }
}

我还应该指出,如果您正在寻找从一个会话持续到下一个运行的应用程序的东西,那么您可以使用内置的,IApplicationStore它在一个使您的代码可测试的界面中从应用程序公开属性字典和 SavePropertiesAsync。

于 2020-04-09T14:06:56.363 回答