【问题标题】:How to replace MvxDefaultViewModelLocator in MVVMCross application如何在 MVVMCross 应用程序中替换 MvxDefaultViewModelLocator
【发布时间】:2012-05-02 18:53:28
【问题描述】:

我想推出自己的 ViewModelLocator 以在应用程序的中心位置为 ViewModel 创建提供 try/catch/log 包装器,为了能够做到这一点,我必须替换默认的 MvxDefaultViewModelLocator。但是我没有找到替换通用方法的方法,只能注入特定于 VM 类型的方法。

我应该如何将我自己的 ViewModelLocator 类作为默认类注入?

【问题讨论】:

    标签: windows-phone-7 xamarin.ios xamarin.android mvvmcross


    【解决方案1】:

    我刚刚重读了您的问题....我回答了另一个问题,不是吗?对不起!

    让我们再试一次......


    默认的 MvxApplication 没有提供任何方法来覆盖这个成员。如果您认为它对您有用,请务必在 GitHub 上提出问题或拉动。

    但是,在不更改 Mvx 代码的情况下,实现我认为您正在寻找的效果的一种方法是简单地替换 IoC/ServiceProvider 框架中的 IMvxViewModelLocatorFinder 接口 - 您可以轻松实现:

      public class MyFinder : IMvxViewModelLocatorFinder
      {
            public IMvxViewModelLocator FindLocator(MvxShowViewModelRequest request)
           {
    
                return new MyDefaultViewModelLocator();
           }
      }
    

    然后您可以在每个客户端项目的安装程序的InitializeLastChance 部分注入这个(覆盖 IoC 中的应用程序条目)?


    或者,如果你愿意,你可以走得更高——你可以替换 IMvxViewModelLoader

    【讨论】:

      【解决方案2】:

      这很简单……但实际上在任何示例中都没有!

      ViewModelLocators 的“容器”是MvxApplication 对象。默认情况下,它使用基于 MvxDefaultViewModelLocator 的约定,它只是尝试使用其声明的具有字符串参数的构造函数来构造 ViewModel 实例。

      如果您想使用自己的 ViewModel 定位器,那么最简单的方法就是从 MvxViewModelLocator 继承并提供返回 ViewModel 实例的公共属性或公共方法:

      例如:

      public class MyViewModelLocator : MvxViewModelLocator
      {
          public MyFirstViewModel CreateFirst()
          {
              return new MyFirstViewModel();
          }
      
          public MySecondViewModel CreateSecond(string aParameter)
          {
              var someLookup1 = ComplicatedStaticThing1.Lookup(aParameter);
              var viewModel = new MySecondViewModel(someLookup1);
      
              var someLookup2 = ComplicatedStaticThing2.Lookup(aParameter, someLookup1);
              viewModel.DoSomething(someLookup2);
      
              return viewModel;
          }
      
          private readonly MyThirdViewModel _third = new MyThirdViewModel();
          public MyThirdViewModel Third
          {
              get
              {
                  return _third;
              }
          }
      }
      

      如果你想比这更低,那么你也可以直接实现 IMvxViewModelLocator。

      要将 ViewModelLocator 添加到应用程序,只需将其实例化并将其添加到您的应用程序中 - 例如:

      public class App 
          : MvxApplication
          , IMvxServiceProducer<IMvxStartNavigation>
      {
          public App()
          {
              this.RegisterServiceInstance<IMvxStartNavigation>(new StartApplicationObject());
      
              base.AddLocator(new MyViewModelLocator());
      
              // to disable the default ViewModelLocator, use:
              // base.UseDefaultViewModelLocator = false;
          }
      }
      

      注意: - 除了设计时数据,我现在非常很少发现需要实现自定义 ViewModelLocator - 通常我想做的所有事情都可以在 ViewModel 构造中完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 2016-01-13
        • 2022-11-14
        • 2010-12-25
        • 1970-01-01
        相关资源
        最近更新 更多