使用Prism

时间:2018-02-13 06:10:17

标签: xamarin.forms prism

我有MyPage CarouselView,下方有两个按钮。这些按钮用于在ContentView

内的CarouselView个视图之间导航
[CarouselView]
[Prev]  [Next]

ContentViewAContentViewB位于CarouselView

MyPageViewModel包含上一个和下一个按钮的命令:

class MyPageViewModel : BindableBase
{
    public ICommand ShowPrevCommand { get; private set;}
    public ICommand ShowNextCommand { get; private set;}
}

如何实施命令以使CarouselView显示视图?

根据文件here

  

在棱镜中,导航到视图或导航到视图的概念   ViewModel不存在。相反,您只需导航到   体验,或代表目标视图的唯一标识符   您希望导航到您的应用程序

所以我以为我可以使用INavigationService。 我以为我可以实现自己的NavigationServiceNavigateAsync我可以检查当前页面是否为MyPage。如果是,我可以根据导航名称参数将CarouselView内的视图设置为视图。

但我不确定如何实施和覆盖Prism的导航服务。

Xamarin Forms的棱镜可以做这样的事吗?

1 个答案:

答案 0 :(得分:1)

它不一定非常复杂。 CarouselView具有可绑定属性Position,您可以将其绑定到viewmodel的属性

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:forms="clr-namespace:Xamarin.Forms;assembly=Xamarin.Forms.CarouselView">
    <ContentPage.Content>
        <forms:CarouselView Position="{Binding CarouselPosition}">
            <!-- whatever to display in the CarouselView -->
        </form:CarouselView>
    </ContentPage.Content>
</ContentPage>

在您的viewmodel中,您可以通过以下方式实现导航:

class MyPageViewModel : BindableBase
{
    public MyPageViewModel()
    {
        ShowPrevCommand = new Command(ShowPrev);
        ShowNextCommand = new Command(ShowNext);
    }

    public ICommand ShowPrevCommand { get; private set;}
    public ICommand ShowNextCommand { get; private set;}

    void OnShowPrev()
    {
        CarouselPosition--;
    }

    void OnShowNext()
    {
        CarouselPosition++;
    }

    public int CarouselPosition
    {
        get => _carouselPosition;
        set
        {
            if(value == _carouselPosition)
            {
                return;
            }

            this._carouselPosition = value;
            PropertyChanges?.Invoke(this, new PropertyChangedEventArgs(CarouselPosition));
        }
    }

}

只是为了获得要点。当然,您必须处理溢出等情况(即CarouselPosition超过轮播中的视图数量等)