Xamarin: обновление пользовательского интерфейса из ObservableCollection (попадания OnPropertyChange (), список обновлений без отображения) - PullRequest
0 голосов
/ 10 января 2020

Это моя первая публикация, поэтому терпите меня.

Я использую формы 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>();
            }
...