Это моя первая публикация, поэтому терпите меня.
Я использую формы Xamarin.
Я пытаюсь обновить стиль корзины покупок ObservableCollection. Мой XAML-файл имеет кнопку, которая выполняет команду «AddCommand» в приведенном ниже коде. Я знаю, что это работает, потому что корзина ObservableCollection обновляется (проверяется с помощью DisplayAlert после получения объекта). Я знаю, что OnPropertyChanged () вызывается, когда я поставил точку останова, и он помечается.
Моя проблема заключается в том, что пользовательский интерфейс не обновляется после этого добавления. Если я добавлю объекты, чтобы начать с этих нагрузок, то только объекты, добавленные с помощью функции AddToBasket, не будут отображаться.
BasketViewModel.cs:
namespace SacredGrounds.ViewModel
{
public class BasketViewModel : ViewModelBase
{
ObservableCollection<BasketItem> _Basket;
public ObservableCollection<BasketItem> Basket
{
get { return _Basket; }
set
{
_Basket = value;
OnPropertyChanged();
}
}
public BasketViewModel()
{
Basket = new ObservableCollection<BasketItem>();
}
public ICommand AddCommand => new Command(AddToBasket);
private async void AddToBasket()
{
Basket.Add(new BasketItem { BasketItemType = BasketItemType.Drink, ProductName = "Test", ProductImage = "coffeeBeans.png", UnitPrice = 2, Quantity = 1 });
await NavigationService.Instance.SwitchToDrinks();
}
}
ViewModelBase.cs
using System.Threading.Tasks;
using Xamarin.Forms;
namespace SacredGrounds.ViewModel.Base
{
public class ViewModelBase : BindableObject
{
public virtual Task InitializeAsync(object navigationData) => Task.FromResult(false);
}
}
Соответствующая часть CartPopupView.Xaml
</pancake:PancakeView>
<Grid
Grid.Row="1"
BackgroundColor="{StaticResource GreenColor}">
<Grid.RowDefinitions>
<RowDefinition Height="250" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- BASKET ITEMS -->
<ListView
x:Name="listView1"
Grid.Row="0"
ItemsSource="{Binding Basket}"
ItemTemplate="{StaticResource BasketItemDataTemplateSelector}"
HasUnevenRows="True"
SeparatorVisibility="Default"
SelectionMode="None"
ItemTapped="RemoveItem"
Margin="0, 6"/>
Соответствующая часть CartPopupView.Xaml.cs
namespace SacredGrounds.Views
{
public partial class CartPopupView : ContentView
{
public delegate void TapDelegate();
public CartPopupView ()
{
InitializeComponent ();
GoToState("Collapsed");
}
Может кто-нибудь сообщить мне, почему мой пользовательский интерфейс не обновляется из этого code?
EDIT: Спасибо Джейсону за помощь в понимании моей ошибки.
Я создавал новый экземпляр класса BasketViewModel для каждой страницы, таким образом, элементы в Observable Collection были, очевидно, разные в зависимости от того, к какому экземпляру я обращался. Я справился с этим, добавив экземпляр Stati c, который я передавал между страницами.
BasketViewModel.cs
namespace SacredGrounds.ViewModel
{
public class BasketViewModel : ViewModelBase
{
public static BasketViewModel _instance;
public static BasketViewModel Instance
{
get
{
if (_instance == null)
_instance = new BasketViewModel();
return _instance;
}
}
ObservableCollection<BasketItem> _Basket;
public ObservableCollection<BasketItem> Basket
{
get { return _Basket; }
set
{
_Basket = value;
OnPropertyChanged();
}
}
public BasketViewModel()
{
Basket = new ObservableCollection<BasketItem>();
}