Hi all,
I update my binding object but the ListView doesn't update. I have to leave the page and reopen it.
My object:
`public class Variant
{
public Command TrashCommand { set; get; }
public Command AddCommand { set; get; }
public Variant()
{
TrashCommand = new Command(OnTrashTapped);
AddCommand = new Command(OnVariantTapped);
}
private void OnVariantTapped(object obj) { var item = obj as Variant; item.Qta = item.Qta + 1; } private void OnTrashTapped(object obj) { var variant = obj as Variant; variant.Qta = variant.Qta - 1; if (variant.Qta < 0) variant.Qta = 0; } public string Id { get; set; } public string ItemId { set; get; } public string Text { get; set; } public int Qta { set; get; } public decimal Price { set; get; } public bool BadgeIsVisible { get { if (Qta > 0) return true; return false; } } }`
My ViewModel:
`public class ItemDetailViewModel : BaseViewModel
{
public Item Item { get; set; }
public ObservableCollection Variants { set; get; }
public ItemDetailViewModel(Item item = null) { Title = item?.Text; Item = item; Variants = new ObservableCollection<Variant>(); foreach (var obj in item.Variants) { Variants.Add(obj as Variant); } } }`
BaseViewModel.cs
`public class BaseViewModel : INotifyPropertyChanged
{
public IDataStore DataStore => DependencyService.Get<IDataStore>();
bool isBusy = false; public bool IsBusy { get { return isBusy; } set { SetProperty(ref isBusy, value); } } string title = string.Empty; public string Title { get { return title; } set { SetProperty(ref title, value); } } protected bool SetProperty<T>(ref T backingStore, T value, [CallerMemberName]string propertyName = "", Action onChanged = null) { if (EqualityComparer<T>.Default.Equals(backingStore, value)) return false; backingStore = value; onChanged?.Invoke(); OnPropertyChanged(propertyName); return true; } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = "") { var changed = PropertyChanged; if (changed == null) return; changed.Invoke(this, new PropertyChangedEventArgs(propertyName)); } #endregion }`
My Page.cs
`[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ItemDetailPopup : PopupPage
{
ItemDetailViewModel viewModel;
public ItemDetailPopup() { InitializeComponent(); } public ItemDetailPopup(Item item) { InitializeComponent(); BindingContext = viewModel = new ItemDetailViewModel(item); } }`
My Page.xaml
<pages:PopupPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup" xmlns:animations="clr-namespace:Rg.Plugins.Popup.Animations;assembly=Rg.Plugins.Popup" mc:Ignorable="d" x:Class="XamarinAPP.Views.Popup.ItemDetailPopup"> <pages:PopupPage.Animation> <animations:ScaleAnimation PositionIn="Bottom" PositionOut="Center" ScaleIn="1.2" ScaleOut="0.8" DurationIn="400" DurationOut="300" EasingIn="SinOut" EasingOut="SinIn" HasBackgroundAnimation="True"/> </pages:PopupPage.Animation> <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand" BackgroundColor="White" Margin="0, 0, 0, 0"> <Image Source="pizza.png" HorizontalOptions="FillAndExpand" HeightRequest="50" /> <Label Text="{Binding Item.Text}" HorizontalTextAlignment="Center" d:Text="{Binding .}" LineBreakMode="NoWrap" Style="{DynamicResource ListItemTextStyle}" FontSize="20" /> <Label Text="{Binding Item.Price, StringFormat='{0:C}'}" HorizontalTextAlignment="Center" LineBreakMode="NoWrap" Style="{DynamicResource ListItemTextStyle}" FontSize="18" /> <Label Text="{Binding Item.Description}" HorizontalTextAlignment="Center" LineBreakMode="NoWrap" Style="{DynamicResource ListItemTextStyle}" FontSize="16" /> <ListView HasUnevenRows="True" x:Name="listViewVariants" IsPullToRefreshEnabled="False" CachingStrategy="RecycleElement" ItemsSource="{Binding Variants}" > <ListView.Header> <Label Text="Varianti" BackgroundColor="LightGray" HorizontalOptions="FillAndExpand" LineBreakMode="NoWrap" VerticalTextAlignment="End" FontSize="18" HeightRequest="45" Padding="10, 0, 0, 5" /> </ListView.Header> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <StackLayout Padding="10"> <StackLayout> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="60*" /> <ColumnDefinition Width="20*" /> <ColumnDefinition Width="20*" /> </Grid.ColumnDefinitions> <BoxView x:Name="itemCount" IsVisible="{Binding BadgeIsVisible}" Grid.Column="0" BackgroundColor="Green" VerticalOptions="Center" HorizontalOptions="Start" WidthRequest="16" HeightRequest="16" CornerRadius="50"> </BoxView> <Label Text="{Binding Qta}" IsVisible="{Binding BadgeIsVisible}" Grid.Column="0" VerticalOptions="Center" HorizontalOptions="Start" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" FontAttributes="Bold" Padding="0,0,0,4" WidthRequest="16" HeightRequest="16" TextColor="White" FontSize="11"/> <Label Grid.Column="0" Text="{Binding Text}" d:Text="{Binding .}" LineBreakMode="NoWrap" Style="{DynamicResource ListItemTextStyle}" FontSize="16" VerticalTextAlignment="Center" Padding="20,0,0,0"/> <Label Grid.Column="1" Text="{Binding Price, StringFormat='{0:C}'}" d:Text="{Binding .}" LineBreakMode="NoWrap" Style="{DynamicResource ListItemTextStyle}" HorizontalTextAlignment="End" VerticalTextAlignment="Center" FontSize="16" TextColor="Red" /> <Image Source="trash.png" Grid.Column="2" WidthRequest="32" IsVisible="{Binding BadgeIsVisible}"> <Image.GestureRecognizers> <TapGestureRecognizer Command="{Binding TrashCommand}" CommandParameter="{Binding .}"/> </Image.GestureRecognizers> </Image> </Grid> </StackLayout> <StackLayout.GestureRecognizers> <TapGestureRecognizer Command="{Binding AddCommand}" CommandParameter="{Binding .}"/> </StackLayout.GestureRecognizers> </StackLayout> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackLayout> </pages:PopupPage>