Xamarin.forms 使用Unity在Prism for Xamarin Forms中注册导航实例

Xamarin.forms 使用Unity在Prism for Xamarin Forms中注册导航实例,xamarin.forms,unity-container,prism,Xamarin.forms,Unity Container,Prism,我想注册一个视图实例,以便在使用Unity的Prism for Xamarin Forms中导航,并在导航到该实例时在关联的视图模型上接收OnNavigatedTo。注册导航实例不受支持,因此我创建了以下扩展: public static void RegisterInstanceForNavigation<TView, TViewModel>(this IUnityContainer container, TView instance, string name = nu

我想注册一个视图实例,以便在使用Unity的Prism for Xamarin Forms中导航,并在导航到该实例时在关联的视图模型上接收OnNavigatedTo。注册导航实例不受支持,因此我创建了以下扩展:

      public static void RegisterInstanceForNavigation<TView, TViewModel>(this IUnityContainer container, TView instance, string name = null)
        where TView : Page
        where TViewModel : class
      {
        if (string.IsNullOrWhiteSpace(name))
        {
            name = typeof(TView).Name;
        }

        ViewModelLocationProvider.Register(typeof(TView).ToString(), typeof(TViewModel));
        PageNavigationRegistry.Register(name, typeof(TView));
        container.RegisterInstance(typeof(object), name, instance, new ContainerControlledLifetimeManager());
     }
public static void registerinstancefernavigation(此IUnityContainer容器,TView实例,字符串名称=null)
何处TView:第页
TViewModel:类的位置
{
if(string.IsNullOrWhiteSpace(name))
{
name=typeof(TView).name;
}
ViewModelLocationProvider.Register(typeof(TView).ToString(),typeof(TViewModel));
PageNavigationRegistry.Register(名称、类型(TView));
RegisterInstance(typeof(object)、name、instance、newcontainerControlledLifetimeManager());
}
在我的app.xaml.cs注册表类型中,我注册了一个导航页面:

this.Container.RegisterInstanceForNavigation<AwesomeView, AwesomeViewModel>(
    new AwesomeView(),
    "seriouslyAnAwesomeView")
this.Container.registerinstancefernavigation(
新建AwesomeView(),
“严重的不安全观点”)
这似乎部分起作用。我可以创建一个页面实例,用名称注册并导航到它。在第一次导航时,将调用相应视图模型的OnNavigatedTo from INavigationAware;但是,在随后的页面导航中,不会调用OnNavigatedTo


这登记有效吗?如果是这样,为什么不叫OnNavigated?如果没有,如何为导航注册实例?

当用户按下后退按钮时,Prism会破坏页面并取消绑定上下文。如果启用了自动关联,Prism仅在创建时设置BindingContext一次。因此,下次Prism导航到您的页面时,绑定上下文是
null
,并且
OnNaviagedTo
永远不会被调用

如上所述,将视图保留在内存中是一种非典型行为,Prism似乎不正式支持这种行为

也就是说,通过手动重置
页面上的绑定上下文
,可以相当轻松地解决此问题。Prism允许您使您的
页面
导航感知如下:

public class MyReusablePage : ContentPage, INavigationAware
{
    ...

    public void OnNavigatingTo(NavigationParameters parameters)
    {
        if (this.BindingContext == null)
        {
            this.BindingContext = new MyReusablePageViewModel();
        }
    }

    ...
}

请注意,新的视图模型实例将与最初为您创建的一个棱柱体不同。如果您需要视图模型实例永远不变,则需要在XAML中禁用自动连接(
AutoWireViewModel=“False”
),并向Unity注册您自己的singleton实例。

当您添加Prism页面时,它将自动将其注册到导航(在Xamarin.Forms上)@EstebanVerbel,我不相信Prism for Xamarin表单会自动注册导航视图,您需要调用RegisterTypeForNavigation。但是,现在它会自动关联视图的视图模型,这样您就不必在视图XAML中包含prism:ViewModelLocator.AutowireViewModel=“True”。但是,您是否愿意进一步解释这与注册和导航到实例(此处实例很重要)的关系?如果在Visual Studio上,您转到工具/扩展和更新,搜索并安装Prism模板包,所有这些都将为您处理。每次添加新的“Prism页面”时,都会自动创建一个ViewModel,并通过名为RegisterTypes()的重写方法在App类上注册,谢谢,但这比基本注册稍微高级一点。当您调用RegisterTypeForNavigation时,该类型在容器中注册,而不是在实例中注册,也没有注册为singleton(容器控制的生存期)。我的目标是注册一个实例。原因是我正在注册的视图创建起来非常密集,我只想创建一次。这是一个用户将经常浏览的视图。当它被注册为一个类型,并且我在其中来回导航时,是否会创建一个新的类型然后将其销毁?我正试图避免这种情况。在这里,您可以找到有关如何安装Prism模板包的更多信息。在这段视频中,Brian Lagunas还介绍了如何安装Prism的一些“功能”