【问题标题】:Navigating to views inside CarouselView with Prism使用 Prism 导航到 CarouselView 内部的视图
【发布时间】:2018-02-13 06:10:16
【问题描述】:

我有一个MyPage 和一个CarouselView,下面有两个按钮。这些按钮用于在CarouselView 内的ContentView 视图之间导航:

[CarouselView]
[Prev]  [Next]

ContentViewAContentViewBCarouselView 内部

MyPageViewModel 具有上一个和下一个按钮的命令:

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

如何执行命令以使CarouselView 显示视图?

根据文档here

在 Prism 中,导航到视图或导航到 视图模型不存在。相反,您只需导航到 经验,或代表目标视图的唯一标识符 您希望在应用程序中导航到的位置

所以我想我可以使用 INavigationService。 我在想我可以实现自己的NavigationService,在NavigateAsync 上我可以检查当前页面是否为MyPage。如果是,我可以将CarouselView 内的视图设置为基于导航名称参数的视图。

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

Xamarin Forms 的 Prism 可以做这样的事情吗?

【问题讨论】:

    标签: xamarin.forms prism


    【解决方案1】:

    不必那么复杂。 CarouselView 具有可绑定属性Position,您可以将其绑定到视图模型的属性

    <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>
    

    在您的视图模型中,您可以通过以下方式实现导航:

    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 超过轮播中的视图数量)等情况。

    【讨论】:

    • 谢谢!你是对的,这绝对可以工作。但是像这样使用Position 属性会使视图模型看起来更像是视图的代码隐藏而不是视图模型。或者也许你是对的,我可能想多了,不太确定......我正在寻找更多的想法......使用 NavigationService 真的会使其更加灵活。但我知道这种灵活性是有代价的(我需要自己实现它,因为 Prism 目前不支持这种 CarouselView 场景)其次,我真的需要它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多