【问题标题】:Need to overide the navigation method需要覆盖导航方法
【发布时间】:2019-06-05 11:48:52
【问题描述】:

我正在使用 autofac 进行依赖注入,我需要覆盖导航功能。为了做到这一点,我做到了

Locator.cs(其中包含 Cs 文件)

         private readonly ContainerBuilder _builder;

    public locator()
    {
        _builder = new ContainerBuilder();
        register();
        Container = _builder.Build();
    }

    public IContainer Container { get; set; }

    private void register()
    {
        _builder.RegisterType<vm>().As<Ivm>();
        _builder.RegisterType<Vm1>();
        _builder.RegisterType < basevm>();

        _builder.RegisterType<MainPage>();
        _builder.RegisterType<xa>();
    }

在我的 app.Xaml.cs 中

在构造函数中

   public App()
    {
        InitializeComponent();
        locator locator1 = new locator();
        Container = locator1.Container;

        MainPage = new NavigationPage(Container.Resolve<MainPage>());
    }
    public static IContainer Container;

然后我试图在我的主页代码中覆盖导航功能,它后面的代码不能被覆盖。我缺少什么以及我在哪里使用它

    public abstract void Navigate(SelectedItemChangedEventArgs e);

    public override async void Navigate(SelectedItemChangedEventArgs e)
    {
        xa patientListViewPage = App.Container.Resolve<xa>();

        await Navigation.PushAsync(patientListViewPage);
    }

为什么这不起作用。我出现这个错误

'MainPage.Navigate(SelectedItemChangedEventArgs)': 没有找到合适的覆盖方法

【问题讨论】:

  • 你想在这里实现什么?大多数应用会引入专门用于导航的服务,以这种方式连接到您的 DI,而不是破解 NavigationPage 的 Navigation 本身。
  • 我不需要任何框架。在这种情况下,我需要使用 di 创建自己的导航系统,这可能吗
  • 我不是在建议一个框架,我是在建议一个专门用于导航的服务,而不是直接调用 Navigation 对象本身。看看微软的Enterprise App Navigation,它应该能更好地描述我的建议。

标签: c# mvvm xamarin.forms autofac


【解决方案1】:

您可以从 NavigationPage 参考中派生。

public class CustomNavigationPage : NavigationPage
{
   //You can define your container here.
   public CustomNavigationPage()
   {
      //You can resolve here 
   }
}

你也可以看看 here

【讨论】:

    【解决方案2】:

    我能想到一个更好的方法您正在使用 Autofac,因此您可以有一个通用的方法来帮助解决这个问题。

       public static async Task NavigateAsync<TContentPage>(INavigation navigation ) where TContentPage : ContentPage
        {
            var contentPage = App.Container.Resolve<TContentPage>();          
    
            await navigation.PushAsync(contentPage, true);
        }
    

    另外如果需要传参数可以这样修改

            public static async Task NavigateAsync<TContentPage, TNavigationParameter>(INavigation navigation,
            TNavigationParameter navParam,
            Action<TContentPage, TNavigationParameter> action = null) where TContentPage : ContentPage
        {
            var contentPage = App.Container.Resolve<TContentPage>();          
            action?.Invoke(contentPage, navParam);           
            await navigation.PushAsync(contentPage, true);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2023-01-07
      • 1970-01-01
      相关资源
      最近更新 更多