【问题标题】:Xamarin Forms / ReactiveUI - Using ReactiveUI for masterdetail page shows that viewmodel is nullXamarin Forms / ReactiveUI - 对 masterdetail 页面使用 ReactiveUI 显示 viewmodel 为空
【发布时间】:2020-04-21 07:04:31
【问题描述】:

我有一个基于 ReactiveUI 的 xamarin 表单应用程序。视图模型继承自 ReactiveObject 和页面 xaml 的代码隐藏,它们继承/基于 ReactiveContentPage,如果是从 ReactiveMasterDetailPage 继承的 masterdetailpage。它自己的 contentpages/masterdetailpage 基于 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>();

【问题讨论】:

    标签: xamarin.forms reactive-programming master-detail reactiveui


    【解决方案1】:
    var viewModel = DependencyInjectionService.Get<TViewModel>();
    var view = _viewLocator.ResolveView(viewModel);
    

    根据提供的代码,我希望您传递给_viewLocator.ResolveView 的值为空。您在注册 IViewFor 的位置显示了代码,但我没有看到任何注册 ViewModel 本身的代码。

    注册IViewFor&lt;Foo&gt;, Foo 不会注册视图模型。它告诉类型系统给定的 ViewModel 将解析特定的页面。

    此外,您使用的容器似乎与 ReactiveUI 提供的容器不同。没关系,但是您必须确保所有依赖项都在您计划从中解析依赖项的容器中正确注册。

    最后。你说它给出了一个 null,但你没有说你传递的 ViewModel 是 null 还是你用来解析的对象是 null。

    无论哪种方式,我认为这是根据提供的信息将依赖项注册在正确位置的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多