【问题标题】:How to re-instantiate page/viewmodel in UWP?如何在 UWP 中重新实例化页面/视图模型?
【发布时间】:2016-05-23 16:53:06
【问题描述】:

我使用MvvmCross 构建我的 UWP 应用程序。我有自己的视图模型的视图。 当我启动应用程序时,第一次使用 ShowViewModel<PasscodeViewModel>() 从设置视图导航到密码视图。然后它调用视图模型和视图构造函数来构建和初始化视图。当用户返回设置视图并使用 ShowViewModel<PasscodeViewModel>() 等相同方法再次导航到密码视图时,此时不会调用视图和视图模型构造函数。由于无法重新初始化密码视图。所以它会显示以前的密码视图实例。

我尝试过的以下解决方案

我尝试删除导航中的后台堆栈,但也没有调用构造函数。

也实现加载的事件,但这个解决方案也不适合我。

也在视图模型中实现了Void Init(),但是这个方法也没有被调用。

我只想在导航到 PasscodeView 时,然后每次调用 PasscodeView 和 PasscodeViewModel 的构造函数。

所以我的问题是每次导航时如何强制重新初始化页面和视图模型? 请帮助解决此问题。

【问题讨论】:

  • 您能否分享您的项目或一些可以重现此问题的示例代码给我们进行调查?

标签: c# xaml xamarin mvvmcross uwp


【解决方案1】:

我需要在必需上使用导航缓存模式。

我用不太干净的解决方案为我解决了这个问题,再次调用 init。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (this.ViewModel!= null && e.NavigationMode != NavigationMode.Back)
    {
        var reqData = (string)e.Parameter;
        var converter = Mvx.Resolve<IMvxNavigationSerializer>();
        var req = converter.Serializer.DeserializeObject<MvxViewModelRequest>(reqData);
        this.Vm.CallBundleMethods("Init", new MvxBundle(req.ParameterValues));
    }

    base.OnNavigatedTo(e);
}

此代码避免在返回导航时再次调用 init。

【讨论】:

    【解决方案2】:

    我刚刚将通用 Windows Phone 应用程序页面导航缓存模式设置为“已禁用”。我认为它的默认值为“必需”。

     public PasscodeView()
        {
            InitializeComponent();           
            NavigationCacheMode = NavigationCacheMode.Disabled;
        }
    

    上面的代码对我有用。

    【讨论】:

    • 我不认为禁用 NavigationCacheMode 是解决此问题的一般方法。需要经常需要 - 因此它是默认设置。您应该将需要在构造函数中初始化的代码与需要在 OnNavigatedTo 事件中初始化的代码分开。后一个事件每次都会被调用。此外,检查该事件中的 NavigationMode 以检测 NavigationMode、back 或 NavigationMode.New
    • @ezaspi 看看我的答案,它适用于 NavigationCacheMode = required
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2017-02-10
    • 2012-06-04
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多