У меня есть просмотр списка с viewcell. Я хочу переключить цвет фона стека на элемент, чтобы он был выбран или нет. Проблема в том, что элемент прокручивается после прокрутки. Только что нажал после прокрутки
Это GIF, который показывает проблему https://drive.google.com/file/d/1-E3rkzwLeuZ6odCmFtfA1roMwrH5tigq/view?usp=sharing
Я попытался удалить список источников элементов и заполнить его снова, но, конечно,не работалЯ попытался сделать CachingStrategy всех типов, но цвет фона изменился только на RetainElement
Версия Xamarin Forms: 4.0.0.425677
Код XAML
<StackLayout Margin="20" BackgroundColor="White">
<Grid>
<ListView x:Name="lstProducts" ItemTapped="lstProducts_ItemTapped" HasUnevenRows="True" ItemsSource="{Binding ProductsList}"
CachingStrategy="RetainElement">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Vertical">
<StackLayout Orientation="Horizontal" BackgroundColor="{Binding SelectedStateColor}">
<Image Source="{Binding ImageUrl}" WidthRequest="40" HeightRequest="40" HorizontalOptions="Start" />
<StackLayout Orientation="Vertical" HorizontalOptions="StartAndExpand">
<Label Text="{Binding title}" FontSize="Large" TextColor="Black" />
<Label Text="{Binding description}" FontSize="Small" TextColor="Gray" />
</StackLayout>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
<Button Text="موافق" Clicked="Submit_Clicked" Style="{StaticResource PurpleButton}" Margin="10,0,10,10" />
</StackLayout>
Модель продукта
public class Product
{
public string title { get; set; }
public string description { get; set; }
public Color SelectedStateColor
{
get
{
if (IsSelected == true)
return Color.LightGreen;
else
return Color.White;
}
}
public bool IsSelected { get; set; }
}
ViewModel
public class ProductsViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private ObservableCollection<Product> _productsList = new ObservableCollection<Product>();
public ObservableCollection<Product> ProductsList
{
get { return _productsList; }
set { _productsList = value;OnPropertyChanged(); }
}
}
ItemTapped
public class ProductsPage : ContentPage
{
public ProductsPage()
{
BindingContext = new ProductsViewModel();
InitializeComponent ();
}
ProductsViewModel Context=> (ProductsViewModel)BindingContext;
private void lstProducts_ItemTapped(object sender, ItemTappedEventArgs e)
{
Product product = (Product)e.Item;
product.IsSelected = !product.IsSelected;
Context.ProductsList[Context.ProductsList.IndexOf(product)] = product;
}
}