Я новичок в Xamarin.Forms, у меня есть просмотр списка с источником элемента.
ItemSource
ListView - это ObserverableCollection
К сожалению, когда я удаляю элемент из ItemSource
событие ItemDisapperaing
не сработало.Да, элемент списка удален из пользовательского интерфейса устройства Android.
Однако я реализовал ItemAppearing
, и это прекрасно работает!Это сработало.
Добавление сценария работы предмета:
- Вызван
ShopCart.Instance.AddItem(randomItem)
. ShopItemListView.ItemsSource
обновляется с добавленным элементом. TotalAmount
Текст обновляется с нужной суммой. Итак, вызывается функция ShopItem_NewItemAdded!
Очистка элементов из сценария Shopcart (не работает)
ShopCart.Instance.Clear()
вызывается. ShopItemListView.ItemShource
будет пусто!Элементы, отсутствующие в интерфейсе пользователя! - Но текст
TotalAmount
не изменился до 0.0!Он по-прежнему имеет предыдущее значение.
Похоже, что в элементе пользовательского интерфейса TotalAmount не обновляется!В «Отладке» я вижу, что после «Очистки» список ShopItemListView.ItemsSource
пуст.
Таким образом, функция ShopItem_ItemRemoved
не вызывается!
Здесь 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;
}
Вот экземпляр синглтона магазинной тележки
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
}
В ShopCart реализован интерфейс INotifyPropertyChanged.Но кажется, что элемент пользовательского интерфейса не уведомлен.
Как я могу обновить TotalAmount
метку на пользовательском интерфейсе после того, как я удалил все элементы магазина из корзины?