Quantcast
Channel: Xamarin.Forms — Xamarin Community Forums
Viewing all articles
Browse latest Browse all 91519

ListView.ItemDisappearing event is not triggered when the item removed from ItemSource

$
0
0

I am new with Xamarin.Forms, I have a listview with an item source.

The ItemSource of the ListView is an ObserverableCollection
Unfortuntaley, when I remove an item from the ItemSource, the ItemDisapperaing event is not trigged. Yes, the list item is removed from the UI in the Android device.

However I implemented the ItemAppearing and that works fine! It triggered.

Adding item working scenario:

  1. The ShopCart.Instance.AddItem(randomItem) called.
  2. ShopItemListView.ItemsSource is refreshed with the newly added item.
  3. TotalAmount's Text is updated with the right amount.
    So the ShopItem_NewItemAdded function is called!

Clearing items from Shopcart scenario (not working)

  1. ShopCart.Instance.Clear() called.
  2. ShopItemListView.ItemShource will be empty! The items not on the UI!
  3. But the TotalAmount's text does not changed to 0.0! It still has the previous value.

It seems on the UI element the TotalAmount is not refreshed! In Debug I see after the Clear the ShopItemListView.ItemsSource list is empty.

So the ShopItem_ItemRemoved function is not called!

Here the Xaml.cs

public ShopView()
    {
        InitializeComponent();
        BindingContext = new ShopViewModel();

        ShopItemListView.ItemsSource = Shop.Instance.ShopItems;
        // This is triggered, it works
        ShopItemListView.ItemAppearing += ShopItem_NewItemAdded;
        // This event is not triggered, it does not work
        ShopItemListView.ItemDisappearing += ShopItem_ItemRemoved;
    }

    // This event is not triggered, it does not work
    private void ShopItem_ItemRemoved(object sender, ItemVisibilityEventArgs e)
    {
       // If I put a breakpoint here the debugger never comes into this method
        TotalAmount.Text = Shop.Instance.ShopItems.Sum(si => si.Price).ToString();
        if (Shop.Instance.ShopItems.Count == 0) {
            ShopInformation.IsVisible = false;
        }
    }

     // This is triggered, it works.
    private void ShopItem_NewItemAdded(object sender, ItemVisibilityEventArgs e)
    {
        TotalAmount.Text = Shop.Instance.ShopItems.Sum(si => si.Price).ToString();
        ShopInformation.IsVisible = true;
    }

Here is the shopcart singleton instance

public sealed class ShopCart : INotifyPropertyChanged
    {
        private static readonly ShopCart _instance = new ShopCart();

        private ShopCart()
        {
            ShopItems = new ObservableCollection<ShopCartItem>();
        }

        public static ShopCart Instance
        {
            get
            {
                return _instance;
            }
        }

        public ObservableCollection<ShopCartItem> ShopItems { get; set; }

        public void AddItem(ShopCartItem ShopCartItem)
        {
            ShopItems.Add(ShopCartItem);
            OnPropertyChanged("ShopItems");
        }

        public void Clear()
        {
            ShopItems.Clear();
            OnPropertyChanged("ShopItems");
        }

        #region INotifyPropertyChanged Implementation
        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }

The ShopCart implement the INotifyPropertyChanged interface. But it seems the UI element is not notified.

How can I refresh the TotalAmount Label on the UI after I removed every shop items from the shop cart?


Viewing all articles
Browse latest Browse all 91519

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>