Home > Mobile >  Invisible Control becomes Visible when closing page Xamarin Forms
Invisible Control becomes Visible when closing page Xamarin Forms

Time:10-24

I have a frame, the IsVisible is binded to a property in my model view that is set to false. when I change the flyout in my shell, the frame makes an appearance as the shell flyout is closing. Any idea why this is happening ?

         // in my model view this is the property
         public bool ShowPanel{ get { return _showPanel; } set { _showPanel = 
         value; OnPropertyChange(); } }
                

         // in my view this is the panel

        <Frame IsVisible="{Binding ShowPanel}"  BackgroundColor="White" BorderColor="Purple"             AbsoluteLayout.LayoutFlags="PositionProportional" WidthRequest="100"  HeightRequest="200" AbsoluteLayout.LayoutBounds="0,0,200,250">
            <local:ExtendedListView  ItemTapped="ExtendedListView_ItemTapped"  ItemsSource="{Binding AllItems}" IsVisible="{Binding ShowPanel}" SelectionMode="None" HorizontalScrollBarVisibility="Always" HorizontalOptions="Fill" VerticalOptions="Fill"  BackgroundColor="Transparent">
                <local:ExtendedListView.ItemTemplate >
                    <DataTemplate>
                        <ViewCell>
                            <Grid Padding="0">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="20" />
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="10*"></ColumnDefinition>
                                    <ColumnDefinition Width="10*"></ColumnDefinition>
                                    <ColumnDefinition Width="20*"></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <Image Grid.Column="0" Image.Source="{Binding ImageUrl}"  HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand"  WidthRequest="50" HeightRequest="50"  x:DataType="local1:ServiceLayers"></Image>
                                <CheckBox Grid.Column="1" IsChecked="{Binding IsVisible, Mode=TwoWay}" Color="Purple" VerticalOptions="Center" HorizontalOptions="Center" x:DataType="local1:ServiceLayers"></CheckBox>
                                <Label Padding="-5,0,0,0"  HorizontalOptions="StartAndExpand" FontAttributes="Bold" TextColor="Black" Grid.Row="0" Grid.Column="2"  HorizontalTextAlignment="Start" Text="{Binding Name}" x:DataType="local1:Service"></Label>


                                <Label></Label>
                            </Grid>

                        </ViewCell>

                    </DataTemplate>
                </local:ExtendedListView.ItemTemplate>
            </local:ExtendedListView>
        </Frame>


       // In the View Class 
       protected override bool OnBackButtonPressed() {

        await Shell.Current.GoToAsync($"//{nameof(MainPage)}");
        return true;
    }
              

CodePudding user response:

If the BindingContext is removed/changed as you navigate away from the page, the Frame would appear as the binding is invalidated and updated by the binding engine. You have two options:

  1. Don't manually clear the BindingContext from the page as the navigation lifecycle and GC should clean up those resources on their own.

  2. Use binding fallbacks to define behavior when the binding source can't be resolved (because you've nulled the BindingContext) or the binding source is resolved but the bound property is null.

  • Related