Xamarin Prism无法使用参数进行导航

时间:2018-03-11 08:39:04

标签: xamarin xamarin.forms prism

对于我的应用程序,我使用框架创建自己的按钮并添加一个tapgesture。在这里,我使用棱镜导航转到带参数的特定页面。然而。我要去的viewmodel不会触发Navigated to方法。这是一些代码。

在调试期间,似乎添加参数没有问题。但是会调用viewmodel的构造函数。

按钮

public class FolderButton : Frame
{
    public FolderButton(Folder folder, INavigationService navigationService)
    {
        var navParams = new NavigationParameters();
        navParams.Add("folder", folder);
        GestureRecognizers.Add(new TapGestureRecognizer()
        {
            Command = new Command(async () => { await navigationService.NavigateAsync("FolderInventory", navParams); }),
        });

        BackgroundColor = Color.CornflowerBlue;
        var thickness = new Thickness();
        thickness.Bottom = 10;
        thickness.Left = 10;
        thickness.Right = 10;
        thickness.Top = 10;
        Margin = thickness;
        CornerRadius = 5;

        var completeStack = new StackLayout();
        var imgStack = new StackLayout();
        imgStack.Padding = thickness;
        imgStack.Children.Add(new Image { Source = "folder.png" });
        completeStack.Children.Add(imgStack);
        var lblStack = new StackLayout();
        lblStack.Padding = thickness;
        lblStack.Children.Add(new Label
        {
            Text = folder.Name,
            HorizontalTextAlignment = TextAlignment.Center,
            VerticalTextAlignment = TextAlignment.Start
        });
        completeStack.Children.Add(lblStack);

        Content = completeStack;
    }
}

调用viewmodel

public class FolderInventoryViewModel : BindableBase, INavigatedAware
{
    public Folder Folder => _folder;

    private readonly INavigationService _navigationService;
    private Folder _folder;
    private readonly ISQLiteService _sqlService;
    private List<Frame> _buttons;

    public List<Frame> Buttons
    {
        get => _buttons;
        set => _buttons = value;
    }

    public FolderInventoryViewModel(Folder folder, INavigationService navigationService, ISQLiteService sqlService)
    {
        _folder = folder;
        _sqlService = sqlService;
        _navigationService = navigationService;
        GetItemsForFolder();
    }

    private void GetItemsForFolder()
    {
        var itemList = _sqlService.GetAllFolderItems(Folder.Name);

        foreach (var item in itemList)
        {
            var itemButton = new ItemButton(_navigationService, item);
            _buttons.Add(itemButton);
        }
    }

    public void OnNavigatedFrom(NavigationParameters parameters)
    {
        if (parameters["folder"] is Folder folder)
        {
            _folder = folder;
        }

    }

    public void OnNavigatedTo(NavigationParameters parameters)
    {
        if (parameters["folder"] is Folder folder)
        {
            _folder = folder;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这不是使用框架的本质。要正确使用Prism及其NavigationParameters,首先要正确地保持MVVM理念。

E.g。

<Button Command="{Binding testCommand}" text="TestButton"/>

您的ViewModel(请原谅,您需要将NavigationService注入ViewModel的构造函数)

private DelegateCommand _testCommand;
public DelegateCommand testCommand =>
        _testCommand?? (_testCommand= new DelegateCommand(ExecuteTest));
private void ExecuteTest()
{
    NavigationParameters navigationParameters = new NavigationParameters();
    navigationParameters.Add("yourParameterId", value);
    NavigationService.NavigateAsync("YourPage", navigationParameters);
}

然后进入下一页

将INAVigationAware继承到您的NextPage:YourNextPage: BaseViewModel, INavigationAware

INAVigationAware有3种方法NavigatingTo,NavigatedTo,NavigatedFrom

在OnNavigated内部,您可以调用已传递的参数

public void OnNavigatedTo(NavigationParameters parameters)
{
    //You can check if parameters has value before passing it inside

    if(parameters.ContainsKey("YourParameterId")
    {
         yourItem = (dataType)parameters[YourParameterId];
    }
}

另请注意:在导航方法

之前,将始终首先调用构造函数