Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将参数传递给PageRenderer Prism Xamarin表单_C#_Xamarin_Xamarin.forms_Prism - Fatal编程技术网

C# 将参数传递给PageRenderer Prism Xamarin表单

C# 将参数传递给PageRenderer Prism Xamarin表单,c#,xamarin,xamarin.forms,prism,C#,Xamarin,Xamarin.forms,Prism,我正在尝试使用Xamarin表单和Prism创建身份验证过程。 我为每个平台创建了PageRenderer类,需要将自定义参数传递给它。试图在ViewModel中使用INavigationAware接口,然后从自定义页面访问它,但在启动PageRenderer后调用了OnNavigatedTo方法,因此导航参数仍然为空 有人能为这个问题提出解决方案吗?有几种方法可以解决这个问题: 1) 按照建议,使页面具有INavigationAware,并设置要从页面呈现器访问的属性。当然,这可能会破坏MVV

我正在尝试使用Xamarin表单和Prism创建身份验证过程。 我为每个平台创建了PageRenderer类,需要将自定义参数传递给它。试图在ViewModel中使用INavigationAware接口,然后从自定义页面访问它,但在启动PageRenderer后调用了OnNavigatedTo方法,因此导航参数仍然为空


有人能为这个问题提出解决方案吗?

有几种方法可以解决这个问题:

1) 按照建议,使页面具有INavigationAware,并设置要从页面呈现器访问的属性。当然,这可能会破坏MVVM模式,这取决于您发送的内容。但是你可以做如下的事情:

创建一个接口

public interface IMyPage
{
    string Message { get; set; }
}
设置ViewModel以处理需要发送到渲染器的参数

public class MainPageViewModel : BindableBase, INavigationAware
{
    private string _message;
    public string Message
    {
        get { return _message; }
        set { SetProperty( ref _message, value ); }
    }

    public void OnNavigatedTo( NavigationParameters parameters )
    {
        Message = parameters[ "message" ].ToString();
    }
}
设置页面以实现界面并在页面上创建BindableProperty

public class MainPage : ContentPage, IMyPage
{
    public static readonly BindableProperty MessageProperty = BindableProperty.Create( nameof( Message ), typeof( string ), typeof( MainPage ), string.Empty );

    public string Message
    {
        get { return (string)GetProperty( MessageProperty ); }
        set { SetProperty( MessageProperty, value ); }
    }
}
在Xaml标记中,将ViewModel中的属性绑定到可绑定属性

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApplication.Views.MainPage"
             Message="{Binding Message}">
</ContentPage>
请注意,更好的方法是只在一个基本页面类型上实现此功能,使页面从中继承,而不是ContentPage或TabbedPage等,然后检查页面是否实现了接口

2) 使用IEventAggregator侦听和处理事件

public class MainPageViewModel : INavigationAware
{
    IEventAggregator _ea { get; }
    public MainPageViewModel( IEventAggregator ea )
    {
        _ea = ea;
    }

    public void OnNavigatedTo( NavigationParameters parameters )
    {
        _ea.GetEvent<MyEvent>().Publish( parameters[ "message" ].ToString() );
    }
}

public class MyPageRenderer : PageRenderer
{
    public MyPageRenderer()
    {
        var ea = ( App as PrismApplication ).Container.Resolve<IEventAggregator>();
        ea.GetEvent<MyEvent>().Subscribe( OnMyEvent );
    }

    public void OnMyEvent( string message )
    {
        // Do what you need to
    }
}
公共类MainPageViewModel:INavigationAware
{
IEVENTAGREGATOR{get;}
公共主页视图模型(IEventAggregator ea)
{
_ea=ea;
}
public void OnNavigatedTo(NavigationParameters)
{
_ea.GetEvent().Publish(参数[“message”].ToString());
}
}
公共类MyPageRenderer:PageRenderer
{
公共MyPageRenderer()
{
var ea=(应用程序作为PrismApplication.Container.Resolve();
ea.GetEvent().Subscribe(OnMyEvent);
}
公共void OnMyEvent(字符串消息)
{
//做你需要做的事
}
}
编辑: 如果需要在初始化时设置某些内容,请记住,可以从渲染器访问容器,并注入接口或具体类型以访问所需的一个或多个属性。我将以Unity为例。这使得代码比使用静态属性更易于测试

public class App : PrismApplication
{
    protected override void RegisterTypes()
    {
        Container.Register<IMySettings,MySettings>( new ContainerControlledLifetimeManager() );
    }
}

public class MyPageViewModel
{
    IMySettings _mySettings { get; }

    public MyPageViewModel( INavigationService navigationService, IMySettings mySettings )
    {
        _mySettings = mySettings;
        // Update this somewhere in the code before navigating to the new page
    }
}

public class MyPageRenderer : PageRenderer
{
    public MyPageRenderer()
    {
        var mySettings = ( App as PrismApplication ).Container.Resolve<IMySettings>();
        // Use MySettings to set the property you need to set
    }
公共类应用程序:PrismApplication
{
受保护的覆盖无效注册表类型()
{
Container.Register(新ContainerControlledLifetimeManager());
}
}
公共类MyPageViewModel
{
IMySettings_mySettings{get;}
公共MyPageViewModel(INavigationService导航服务、IMySettings mySettings)
{
_mySettings=mySettings;
//在导航到新页面之前,请在代码中的某个位置更新此内容
}
}
公共类MyPageRenderer:PageRenderer
{
公共MyPageRenderer()
{
var mySettings=(应用程序作为PrismApplication.Container.Resolve();
//使用MySettings设置需要设置的属性
}

正如您所知,您也可以将INavigationAware界面添加到页面本身。我从未尝试过做您正在做的事情,但看看这是否有帮助。行为与以前相同。我不想因此而破坏MVVM。如果没有示例或更多信息,很难理解您的问题。1)您了解过程吗ss 6.3.0过程将
OnNavigatingTo
->推送新页面->
OnNavigatedFrom
->
OnNavigatedTo
(6.2没有
OnNavigatingTo
2)有什么原因可以在启动PageRenderer后处理参数吗?我只需要将参数传递给PageRenderer,并使用PrismThanks!我已经使用静态属性解决了我的问题,该属性已存在于我使用的第三方库中。您的解决方案可能无法在OnNavigatedTo之前启动PageRenderer。+1详情和样品
public class App : PrismApplication
{
    protected override void RegisterTypes()
    {
        Container.Register<IMySettings,MySettings>( new ContainerControlledLifetimeManager() );
    }
}

public class MyPageViewModel
{
    IMySettings _mySettings { get; }

    public MyPageViewModel( INavigationService navigationService, IMySettings mySettings )
    {
        _mySettings = mySettings;
        // Update this somewhere in the code before navigating to the new page
    }
}

public class MyPageRenderer : PageRenderer
{
    public MyPageRenderer()
    {
        var mySettings = ( App as PrismApplication ).Container.Resolve<IMySettings>();
        // Use MySettings to set the property you need to set
    }