Обновление содержимого страницы перед переходом в формах Xamarin с помощью Prism

#c# #android #xamarin.forms #mvvm #prism

#c# #Android #xamarin.forms #mvvm #prism

Вопрос:

Во время моей навигации с помощью «Меню гамбургеров» в Prism.Forms ( Master Detail Page ) моя текущая выбранная страница, с которой я перехожу, действует странно, как будто она обновляется / сбрасывается. На этой конкретной странице у меня есть «логический рендеринг», XAML где я играю со IsVisible свойством. Существует сценарий, в котором я должен видеть только некоторое содержимое в формате PNG, покрывающее содержимое внизу, но когда я перемещаюсь с помощью Hamburger, PNG исчезает, и я могу видеть содержимое, которого не должен видеть на мгновение. Похоже, что привязки свойств отключены или что-то в этом роде. CollectionViews внизу PNG пусто, все выглядит как в предварительном просмотре Visual Studio Xaml во время кодирования, где XAML он понятия не имеет о привязках, он просто показывает все с содержимым по умолчанию.

Эта XAML страница ( MainPage.xaml ) выглядит следующим образом:

 <Grid>

        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        
            <Image Source="nfc.png" IsVisible="{Binding IsFirstRead}" BackgroundColor="White" />
            <Button Grid.Row="1" Text="NotFirstRead" Command="{Binding NotFirstReadCommand}" />

            <Grid IsEnabled="{Binding IsFirstRead, Converter={StaticResource InverseBoolean}}" 
                            Opacity="{Binding IsFirstRead, Converter={StaticResource InverseBoolToDigit}}" 
                            HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">

                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>

                <Button Grid.Row="0" Text="{Static resources:Strings.Button_WriteTag}" Command="{Binding WriteTagCommand}" />
                <Button Grid.Row="1" Text="FirstRead" Command="{Binding FirstReadCommand}" />

                <CollectionView Grid.Row="2" ItemsSource="{Binding FrontControlsCollection}" BackgroundColor="Yellow">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <StackLayout Orientation="Vertical" >
                                <Label Text="{Binding MemoryMapItem.Name}" />
                                <Entry Text="{Binding NewValue}" Margin="0" BackgroundColor="AliceBlue">
                                    <Entry.Triggers>
                                        <DataTrigger TargetType="Entry" Binding="{Binding MemoryMapItem.DataType}" Value="{Static dt:DataType.Int}">
                                            <Setter Property="Keyboard" Value="Numeric" />
                                        </DataTrigger>
                                    </Entry.Triggers>
                                </Entry>
                            </StackLayout>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>

                <CollectionView Grid.Row="3" ItemsSource="{Binding MifarePagesCollection}" BackgroundColor="Red">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Label Text="{Binding RecordView}" />
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>

            </Grid>
    </Grid>
  

XAML корня (MDP):

     <MasterDetailPage.Master>
        <ContentPage Title="Menu">
            <StackLayout Padding="20">
                <Button Text="{Static resources:Strings.Label_Home }" Command="{Binding NavigateCommand}" CommandParameter="NavigationPage/MainPage" />
                <Button Text="{Static resources:Strings.Label_Language}" Command="{Binding NavigateCommand}" CommandParameter="NavigationPage/LanguagePage" />
            </StackLayout>
        </ContentPage>
    </MasterDetailPage.Master>
  

Корень VM :

     public class RootPageViewModel : ViewModelBase
    {
        private DelegateCommand<string> _navigateCommand;

        public DelegateCommand<string> NavigateCommand => _navigateCommand ??= new DelegateCommand<string>(ExecuteNavigateCommand);

        private async void ExecuteNavigateCommand(string uri)
        {
            await NavigationService.NavigateAsync(uri);
        }

        public RootPageViewModel(INavigationService navigationService) : base(navigationService)
        {
            
        }
    }
  

Вот видео, показывающее проблему:
https://drive.google.com/file/d/1Z5htYQrznG86C67AmBJ8hCl9_x_FzN88/view?usp=sharing

Здесь вы даже можете увидеть, что PNG на самом деле не исчезает, а скорее z-index находится ниже, чем все остальное (вы можете видеть это между элементами).

Комментарии:

1. Очень интересно…. Я вижу аналогичные проблемы с макетом с вкладками (также с использованием Prism)…

2. Точно. Мой друг использует макет с вкладками, как и вы, и у него такая же проблема

3. Что он собирается сделать, чтобы это исправить? Я подумал о том, чтобы попробовать оболочку с вкладками, но не уверен, готова ли она к производству ….? Также рассматривается Sharpnado — но это, похоже, более масштабный рефакторинг, который я еще не проводил, просто чтобы проверить, работает ли он лучше….