首页 > 解决方案 > Xamarin Forms Prism 列表视图中的导航问题

问题描述

正如标题所示,我的导航有问题。我有一个页面叫EvaluationPage,它包含四个ContentPage,里面有一个Grid。在这个级别上,我有一个按钮 (FAB) 和 CollectionView。CollectionView 有 Itemsource 和 ObservableCollection

FAB 在 Modal 模式下打开ReferenciaLaboralPage。如果填写了包含此页面的表单并单击了保存按钮,则将项目添加到 itemsource 的可观察集合中。它是由 Singleton 完成的。

集合视图更新新项目,该项目具有执行命令以打开先前以模态模式打开的页面的点击手势,这是它不起作用的地方。该命令确实运行,但 NavigateAsync 不显示该页面。

XAML 评估页面

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <CollectionView ItemsSource="{Binding ReferenciasPersonales}" EmptyView="No existen referencias" VerticalOptions="FillAndExpand" Grid.Row="0">
            <CollectionView.ItemsLayout>
                <LinearItemsLayout Orientation="Vertical" 
                       ItemSpacing="0" />
            </CollectionView.ItemsLayout>

            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout>
                            <Grid>
                            <Grid.GestureRecognizers>
                                <TapGestureRecognizer Command="{Binding SelectedCommand}" NumberOfTapsRequired="1" />
                            </Grid.GestureRecognizers>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="60" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="80" />
                                </Grid.ColumnDefinitions>

                                <pancake:PancakeView Grid.Column="0">
                                    <Label Text="{Binding Letter}" TextColor="White"  />
                                </pancake:PancakeView>

                                <StackLayout Grid.Column="1" >
                                    <Label Text="{Binding Nombre}" Style="{StaticResource RobotoBold}" FontSize="16"  />
                                    <Label Text="{Binding TipoReferencia}" Style="{StaticResource RobotoRegular}" />
                                    <Label Text="{Binding Telefono}" Style="{StaticResource RobotoRegular}" />
                                    <Label Text="{Binding TiempoConocerlo}" Style="{StaticResource RobotoRegular}" />
                                </StackLayout>

                                <Label Grid.Column="2" Text="{Binding FechaRegistro, StringFormat='{0:dd/MM/yyyy}'}" />
                            </Grid>
                            <BoxView HorizontalOptions="FillAndExpand" BackgroundColor="LightGray" HeightRequest="1" />
                        </StackLayout>

                </DataTemplate>
            </CollectionView.ItemTemplate>

        </CollectionView>

        <pancake:PancakeView Elevation="10" VerticalOptions="End" HorizontalOptions="End" Margin="0,0,20,22" HeightRequest="50" WidthRequest="50" CornerRadius="25" Grid.Row="0">
            <pancake:PancakeView.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding OpenReferenciaCommand}" NumberOfTapsRequired="1" />
            </pancake:PancakeView.GestureRecognizers>
            <Label Text="&#xf067;" TextColor="White" Style="{StaticResource IconStyleSolid}" VerticalOptions="Center" HorizontalOptions="Center" />
        </pancake:PancakeView>
    </Grid>

代码评估PageViewModel

public DelegateCommand OpenReferenciaCommand => _openReferenciaCommand ?? (_openReferenciaCommand = new DelegateCommand(ShowReferenciaPersonal));

async void ShowReferenciaPersonal()
        {

            await _navigationService.NavigateAsync("ReferenciaPersonalPage", useModalNavigation: true);
        }

// Add item to datasource
public void AddReferenciaPersonal(ReferenciaPersonalItemViewModel item)
        {
            if (item.IdReferencia == 0)
            {
                ReferenciasPersonales.Add(item);
            }
            else
            {
                ReferenciasPersonales.Remove(ReferenciasPersonales.Where(w=>w.IdReferencia == item.IdReferencia).Single());
                ReferenciasPersonales.Add(item);
                ReferenciasPersonales = ReferenciasPersonales;
            }
        }

代码参考PersonalPageViewModel

public class ReferenciaPersonalPageViewModel : ViewModelBase
    {
        private readonly INavigationService _navigationService;
        private readonly IApiService _apiService;
        private readonly IDialogService _dialogService;
        private DelegateCommand _closeCommand;
        private DelegateCommand _saveCommand;

        private string _nombre;

        private ReferenciaPersonalItemViewModel _item;

        private bool _isRunning;
        private bool _isEnable;

        public ReferenciaPersonalPageViewModel(INavigationService navigationService, IApiService apiService, IDialogService dialogService) : base(navigationService)
        {
            _navigationService = navigationService;
            _apiService = apiService;
            _dialogService = dialogService;
            _item = new ReferenciaPersonalItemViewModel(navigationService);
        }

        public string Nombre
        {
            get => _nombre;
            set => SetProperty(ref _nombre, value);
        }

        public bool IsRunning
        {
            get => _isRunning;
            set => SetProperty(ref _isRunning, value);
        }

        public bool IsEnable
        {
            get => _isEnable;
            set => SetProperty(ref _isEnable, value);
        }
        #endregion

        #region Commands

        public DelegateCommand CloseCommand => _closeCommand ?? (_closeCommand = new DelegateCommand(ExecuteCloseCommand));
        public DelegateCommand SaveCommand => _saveCommand ?? (_saveCommand = new DelegateCommand(ExecuteSaveCommand));
        #endregion

        #region Metodos
        async void ExecuteCloseCommand()
        {
            await _navigationService.GoBackAsync();
        }

        private async void ExecuteSaveCommand()
        {
            IsRunning = true;
            IsEnable = false;

            _item.Direccion = Direccion;
            _item.Nombre = Nombre;
            _item.Telefono = Telefono;
            _item.TiempoConocerlo = TiempoConocerlo;
            _item.TipoReferencia = TipoReferencia;
            _item.FechaRegistro = _item.IdReferencia > 0 ? _item.FechaRegistro : DateTime.Now.ToLocalTime();

            EvaluacionPageViewModel.GetInstance().AddReferenciaPersonal(_item);

            IsRunning = false;
            IsEnable = true;

            await _navigationService.GoBackAsync();

        }
        #endregion

        public override void OnNavigatedTo(INavigationParameters parameters)
        {
            base.OnNavigatedTo(parameters);
            if (parameters.ContainsKey("item"))
            {
                _item = parameters.GetValue<ReferenciaPersonalItemViewModel>("item");
                Nombre = _item.Nombre;
                Direccion = _item.Direccion;
                Telefono = _item.Telefono;
                TiempoConocerlo = _item.TiempoConocerlo;
                TipoReferencia = _item.TipoReferencia;
            }
        }
    }

代码参考PersonalItemViewModel

 public class ReferenciaPersonalItemViewModel : Referencia
    {
        private readonly INavigationService _navigationService;
        private DelegateCommand _selectedCommand;

        public ReferenciaPersonalItemViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;
        }


        public DelegateCommand SelectedCommand => _selectedCommand ?? (_selectedCommand = new DelegateCommand(ShowItem));

        private async void ShowItem()
        {
            await _navigationService.NavigateAsync("ReferenciaPersonalPage", useModalNavigation: true);
        }
    }

当我单击(fab)按钮打开模式时,在 NavigateAsync 之前的 NavigationUriPath 是:

/MainMasterDetailPage/NavigationPage/HomePage/ItineraryPage/EvaluationPage

当我单击 collectionview 项以打开模式时,在 NavigateAsync 之前的 NavigationUriPath 是:

/MainMasterDetailPage/NavigationPage/HomePage/ItinerarioPage/EvaluacionPage/ReferenciaPersonalPage?useModalNavigation=true

如果我放置绝对路径,如果它显示页面但用导航栏显示它

标签: xamarin.formsprism

解决方案


推荐阅读