Здравствуйте,
У меня очень неприятная проблема, мне нужно просто, но у меня неожиданная проблема, вот что я пытаюсь сделать:
У меня есть вид списка, содержащий 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.
Пожалуйста, ПОМОГИТЕ!