BindableBase не работает на CollectionView - PullRequest
0 голосов
/ 30 октября 2019

У меня есть CollectionView в моем проекте с наиболее стабильной версией Xamarin Forms, которая поддерживает CollectionView (4.3.0.908675) со следующим кодом ниже.

   <CollectionView x:Name="ScrollButtons"
                ItemsSource="{Binding MenuItems}"
                SelectedItem="{Binding SelectedMenuItem, Mode=TwoWay}"
                Grid.Row="2" 
                Grid.Column="0"
                Grid.ColumnSpan="2" 
                HeightRequest="90"
                SelectionMode="Single"
                SelectionChangedCommand="{Binding MenuItemSelectedCommand}"
                BackgroundColor="{DynamicResource BackgroundColorShell}">
    <CollectionView.Footer>
        <!--HACK to keep showing last item on CollectionView -->
        <BoxView BackgroundColor="Transparent" HeightRequest="90" WidthRequest="50"/>
    </CollectionView.Footer>
    <CollectionView.ItemsLayout>
        <GridItemsLayout Orientation="Horizontal"
                        Span="1" HorizontalItemSpacing="5"/>
    </CollectionView.ItemsLayout>
    <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid WidthRequest="90" HeightRequest="90" Padding="1">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Frame Grid.Column="0"
                           Grid.Row="0"
                           BorderColor="Black"
                           BackgroundColor="{Binding BackgroundColor}"
                           >
                     </Frame>
                    <StackLayout Padding="5" Grid.Row="0" Grid.Column="0">
                        <Label Text="{Binding Text}"
                               TextColor="{Binding TextColor}"
                               LineBreakMode="WordWrap"
                               FontSize="{StaticResource BaseFontSize}"
                               x:Name="tileLabel">
                        </Label>
                        <StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand" VerticalOptions="EndAndExpand">
                          <Image Source="{Binding SecondaryIconSource}"
                                 HorizontalOptions="Start"
                                 VerticalOptions="EndAndExpand"
                                 WidthRequest="25"
                                 HeightRequest="25"
                                 IsVisible="{Binding IsSecondaryIconVisible}"
                                 />
                          <Image Source= "{Binding ImageIcon}"
                                 HorizontalOptions="EndAndExpand"
                                 VerticalOptions="EndAndExpand"
                                 WidthRequest="25"
                                 HeightRequest="25"
                                 x:Name="tileIcon">
                          </Image>
                        </StackLayout>
                    </StackLayout>
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
</CollectionView>

OnMenuSelectedItemCommand

    private async Task OnMenuItemSelected()
    {
        Console.WriteLine("OnMenuItemSelected");
        await NavigationService.NavigateAsync($"{SelectedMenuItem.NavigationPath}");
        HighlightedMenuItem = SelectedMenuItem;
        SelectedMenuItem = null;
    }

CollectionView состоит из коллекции класса BottomMenuItem, который наследуется от BindableBase for Prism. Моя цель - изменить свойства объекта BottomMenuItem, выбранного в CollectionView. Однако представление коллекции ведет себя странно и изменяется только в зависимости от BottomMenuItem, которого в данный момент нет на экране. Как показано ниже, он работает только для 5-го элемента и выше, элементов, которые изначально не загружаются на экран.

Любая помощь будет принята с благодарностью. Спасибо!

CollectionViewImage

1 Ответ

1 голос
/ 30 октября 2019

Я понял это. Проблема в том, что мой код использует прокрутку до элемента, чтобы выделить выделенный элемент. Я сделал предположение, что ошибка основана на том, что изначально загруженные ячейки элементов не работают, но на самом деле это были элементы, которые не нуждаются в прокрутке.

Основываясь на моих OnMenuItemSelected, я пропускаю выделенный элементна следующую страницу. Обработайте эту логику с помощью логики OnNavigatingTo, приведенной ниже.

    public override async void OnNavigatingTo(INavigationParameters parameters)
    {
        base.OnNavigatingTo(parameters);

        Console.WriteLine("OnNavigatingTo");

        HighlightedMenuItem = parameters.GetValue<BottomMenuItem>("highlightedMenuItem");

        foreach (var item in MenuItems)
        {
            item.IsActive = false;
        }

        if (HighlightedMenuItem != null)
        {
            Console.WriteLine("OnNavigatingTo HighlightedItem - {0}", HighlightedMenuItem.Text);

            HighlightedMenuItem.IsActive = true;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...