Xamarin Forms - ListView: привязка IsVisible к невидимому элементу в представлении списка не работает после прокрутки, чтобы показать этот элемент - PullRequest
0 голосов
/ 27 июня 2019

Здравствуйте,

У меня очень неприятная проблема, мне нужно просто, но у меня неожиданная проблема, вот что я пытаюсь сделать:

У меня есть вид списка, содержащий 2 метки во ViewCell, обе метки показывают одно и то же поле, но разница в том, что первая видна, а шрифт нормальный, а вторая невидима, а шрифт полужирный, что я и хотелчтобы сделать это, когда я нажимаю на элемент, чтобы изменить свойство с именем: «Выбрано» с ложного на истинное и наоборот, чтобы жирный шрифт показать / скрыть, чтобы сообщить пользователю, что элемент выбран.

ВЧтобы достичь этого, я написал свой код и развернул простое приложение на своем устройстве Android, и оно работало как чудо, но после этого я заметил, что если я прокручиваю список до элемента, который не был показан на экране, и нажимаю на негоэлемент, первая нормальная метка исчезла, что является ожидаемым поведением , но вторая жирная метка не отображается

Ниже приведен мой код:

testVisibilityProblem.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             xmlns:local="clr-namespace:CPALMSStandardsViewer;assembly=CPALMSStandardsViewer"
             xmlns:b="clr-namespace:Prism.Behaviors;assembly=Prism.Forms"
             xmlns:converters="clr-namespace:CPALMSStandardsViewer.Converters"
             xmlns:Helpers="clr-namespace:CPALMSStandardsViewer.Helper"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="CPALMSStandardsViewer.Views.testVisibilityProblem">
    <Grid>
        <ListView Margin="10,0,10,0"
                  BackgroundColor="White"
                  SeparatorColor="Gray"
                  ItemsSource="{Binding CustomEntities}"
                  VerticalOptions="Fill"
                  SelectionMode="None"
                  HasUnevenRows="True">
            <ListView.Behaviors>
                <b:EventToCommandBehavior EventName="ItemTapped" 
                                          Command="{Binding SelectCustomEntity}"
                                          EventArgsConverter="{converters:ItemTappedEventArgsConverter}" />
            </ListView.Behaviors>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid>
                            <Label  Grid.Column="0" Grid.Row="0" Text="{Binding Name}" TextColor="Black" IsVisible="{Binding IsSelected, Converter={Helpers:InverseBoolConverter}}"></Label>
                            <Label  Grid.Column="0" Grid.Row="0" Text="{Binding Name}" TextColor="Black" FontAttributes="Bold" IsVisible="{Binding IsSelected}"></Label>
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</ContentPage>

testVisibilityProblemViewModel.cs

using CPALMSStandardsViewer.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace CPALMSStandardsViewer.ViewModels
{
    public class testVisibilityProblemViewModel : ViewModelBase
    {
        public ObservableCollection<CustomEntity> CustomEntities { get; set; }

        public testVisibilityProblemViewModel(INavigationService navigationService)
            : base(navigationService)
        {
            Title = "Test Visibility Problem!";
            CustomEntities = new ObservableCollection<CustomEntity>();
            for (int i = 0; i < 50; i++)
            {
                CustomEntities.Add(new CustomEntity() { Name = "Item " + i, IsSelected = false });

            }
        }

        private DelegateCommand<CustomEntity> _SelectCustomEntity;
        public DelegateCommand<CustomEntity> SelectCustomEntity => _SelectCustomEntity ?? (_SelectCustomEntity = new DelegateCommand<CustomEntity>(ExecuteSelectCustomEntityCommand));

        private void ExecuteSelectCustomEntityCommand(CustomEntity paramData)
        {
            paramData.IsSelected = !paramData.IsSelected;
        }


    }
}

CustomEntity.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
namespace CPALMSStandardsViewer.Models
{
    public class CustomEntity : INotifyPropertyChanged
    {

        public virtual string Name { get; set; }

        private bool _IsSelected;
        public bool IsSelected { get { return _IsSelected; } set { _IsSelected = value; OnPropertyChanged("IsSelected"); } }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string name = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

Я много искал по этой проблеме, и все, что я нашел, это что-то, связанное с OnPropertyChanged (), кто-то пропустил использование наблюдаемой коллекции, кто-то пропустил использование OnPropertyChanged (), другой использовал его неправильно ...

Но моя проблема в другом, дело не в связывании, потому что верхние элементы работали как положено, а также, как я уже упоминал, первый ярлык становится скрытым, что ожидается,Моя проблема заключается в том, что при переключении IsVisible с false на true для элемента, который не отображался на экране, он просто не работает.

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

Обратите внимание, что UWP работает должным образом, моя проблема на платформе Android.

Пожалуйста, ПОМОГИТЕ!

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