Вопрос по xamarin.android, windows-phone-7, xamarin.ios, mvvmcross – Как заменить MvxDefaultViewModelLocator в приложении MVVMCross

1

Я хотел бы свернуть свой собственный ViewModelLocator, чтобы предоставить оболочку try / catch / log для создания ViewModel в центральном месте в приложении, чтобы иметь возможность сделать это, я заменил MvxDefaultViewModelLocator по умолчанию. Но я не нашел способа заменить общий, а только ввести тип, специфичный для виртуальной машины.

Как мне добавить свой собственный класс ViewModelLocator как класс по умолчанию?

Ваш Ответ

2   ответа
0

не так ли? Сожалею!

Давайте попробуем еще раз ...

MvxApplication по умолчанию не предоставляет никакого способа переопределить этот элемент. Если вы считаете, что это будет полезно, то непременно поднимите вопрос или потяните за GitHub.

Однако, не изменяя код Mvx, один из способов добиться эффекта, который, я думаю, вы ищете, - это просто заменить интерфейс IMvxViewModelLocatorFinder в платформе IoC / ServiceProvider - вы можете легко реализовать:

  public class MyFinder : IMvxViewModelLocatorFinder
  {
        public IMvxViewModelLocator FindLocator(MvxShowViewModelRequest request)
       {

            return new MyDefaultViewModelLocator();
       }
  }

и затем вы могли бы внедрить это (перезаписать запись приложения в IoC) во времяInitializeLastChance часть установки для каждого из клиентских проектов?

В качестве альтернативы, вы можете пойти еще выше, если хотите - вместо этого вы можете заменить IMvxViewModelLoader

0

«Контейнер» для 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;
    }
}

Замечания: - кроме данных о времени проектирования, я сейчасvery редко возникает необходимость реализации пользовательского ViewModelLocator - в общем, все, что я хочу сделать, может быть сделано в конструкции ViewModel.

Похожие вопросы