Xamarin Forms / ReactiveUI - Использование ReactiveUI для страницы masterdetail показывает, что viewmodel имеет значение null - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть приложение xamarin форм, основанное на ReactiveUI. Модели представления наследуются от ReactiveObject и кода за xaml страниц, которые они наследуют / основаны на ReactiveContentPage, в случае страницы masterdetail, которую она наследует от ReactiveMasterDetailPage. Сама страница контента / masterdetail основана на ReactiveContent.

Я хочу достичь следующего: получить представления / xamlpages, указав тип модели представления. У меня есть следующий код для этого. Но это дает нулевое значение в _viewLocator.Resolve ...

        public async Task<TViewModel> PushViewModelAsync<TViewModel>(bool animated) where TViewModel : class
    {
        var viewModel = DependencyInjectionService.Get<TViewModel>();
        var view = _viewLocator.ResolveView(viewModel);

        if (view is Page page)
        {
            view.ViewModel = viewModel;

            await Application.Current.MainPage.Navigation.PushAsync(page, animated);
            return viewModel;
        }
        else
        {
            throw new ArgumentException($"resolved view for {typeof(TViewModel)} is not a page.");
        }
    }

Проблема в том, что это работает для обычных страниц содержимого, но не работает для моего MasterDetailPage, как это возможно?

      <?xml version="1.0" encoding="utf-8" ?>
       <rxui:ReactiveMasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
           xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
           xmlns:d="http://xamarin.com/schemas/2014/forms/design"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
         xmlns:vm="clr-namespace:DriverApp.ViewModels"
         x:TypeArguments="vm:MainViewModel"      
         xmlns:rxui="clr-namespace:ReactiveUI.XamForms;assembly=ReactiveUI.XamForms"
         xmlns:local="clr-namespace:DriverApp.Views; assembly=MasterDetailPageNavigation"
         x:Class="DriverApp.Views.MainPage"
         Title="Personal Organiser">

<MasterDetailPage.Master>
    <local:MasterPage x:Name="masterPage" />
</MasterDetailPage.Master>

<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <local:PlanningPage/>
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>

Модель представления:

public class MainViewModel : ReactiveObject, IActivatableViewModel
{

}

Я внедряю это так:

        services.AddTransient<IViewFor<MainViewModel>, MainPage>();

1 Ответ

0 голосов
/ 21 апреля 2020
var viewModel = DependencyInjectionService.Get<TViewModel>();
var view = _viewLocator.ResolveView(viewModel);

Исходя из предоставленного кода, я ожидаю, что значение, которое вы передаете в _viewLocator.ResolveView, будет нулевым. Вы показали код, в котором вы регистрируете IViewFor, но я не вижу никакого кода, регистрирующего саму ViewModel.

Регистрация IViewFor<Foo>, Foo не регистрирует модель представления. Он сообщает системе типов, что данный ViewModel разрешит указанную c страницу.

Кроме того, похоже, что вы используете контейнер, отличный от того, который предоставлен ReactiveUI. Это нормально, но вы должны убедиться, что все ваши зависимости правильно зарегистрированы в контейнере, из которого вы планируете разрешить зависимости.

Наконец. Вы говорите, что он дает ноль, но вы не говорите, что передаваемая модель ViewMull равна нулю или объект, который вы используете для разрешения, равен нулю.

В любом случае, я думаю, что это проблема наличия зависимости, зарегистрированные в правильном месте, на основании предоставленной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...