Xamarin Forms соединяет продукты с учетными записями пользователей

Я делаю приложение для покупок, в нем есть учетная запись для пользователя, и когда пользователь покупает продукт, он должен быть добавлен в список в его учетной записи. Поэтому я попытался поместить статический объект класса пользователя, у которого есть список продуктов, и всякий раз, когда пользователь нажимает кнопку покупки, он должен быть добавлен в список. В то же время user.xaml привязывается к тому же объекту. Но это не работает. В чем ошибка моего метода? Есть ли лучшие идеи для этого?

вот статическое поле в файле App.xaml.cs

 private IDataService _dataService;

 public static User TheUser;
 public App(IDataService dataService)
 {
     TheUser = new User();
     InitializeComponent();
     var unity = new UnityContainer();
     unity.RegisterType<IDataService, DataServices>();
     ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(unity));
     _dataService = dataService;
     MainPage = new NavigationPage(new MainPage());

 }

и вот свойство User.xaml.cs

public User User
{
    get { return App.TheUser; }
    set
    { 
        if(App.TheUser!= null)
        App.TheUser = value;
    }

    //User class 
    public class User : Base //Base class implements INotifyPropertyChanged
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ObservableCollection<Product> Products = new ObservableCollection<Product>();
    }


  public class Base : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Вот файл User.Xaml

<StackLayout>

    <AbsoluteLayout>
     <Image AbsoluteLayout.LayoutBounds="1 , 0 ,96 ,96" AbsoluteLayout.LayoutFlags="PositionProportional"/>
     <Label AbsoluteLayout.LayoutBounds="0 , 50 , 100 , 20" AbsoluteLayout.LayoutFlags="XProportional" Text="First Name"/>
     <Label AbsoluteLayout.LayoutBounds="0 , 100 , 100 , 20" AbsoluteLayout.LayoutFlags="XProportional" Text="Last Name"/>
 </AbsoluteLayout>

    <ListView x:Name="UserListView"
              SelectedItem="{Binding SelectedItemCommand}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>

                <StackLayout Spacing="3" FlowDirection="RightToLeft" >
                    <Image Source="{Binding ProductMainImage}" Aspect="AspectFill" Margin="3" HeightRequest="300" />

                    <Label Text="{Binding Name ,StringFormat=' الاسم : {0}'}"/>
                    <Label Text="{Binding Price ,StringFormat=' السعر : {0}'}"/>
                    <Label Text="{Binding Description ,StringFormat=' الوصف : {0}'}"/>
                </StackLayout>
                </ViewCell>

                </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

person Ammar0ah    schedule 17.09.2018    source источник
comment
как вы отправляете уведомление об изменении при изменении идентификатора, имени или продукта? Можете ли вы включить свой xaml? Что именно не работает? привязка? Если вы используете единичный контейнер, изучали ли вы фреймворк MVVM? Я бы порекомендовал Prism. Unity - это один из контейнеров, с которыми он работает из коробки.   -  person Neil    schedule 17.09.2018
comment
Я использую uity только для исключения класса для моего интерфейса, когда класс вызывает его не для MVVM, для уведомления, что я использую INotifyPropertyChanged в базовом классе   -  person Ammar0ah    schedule 17.09.2018
comment
Ok. поэтому, когда свойство Id установлено в пользовательском объекте, как пользовательский интерфейс узнает, что свойство было установлено? где код, который фактически вызывает уведомление.   -  person Neil    schedule 17.09.2018
comment
Я отредактировал сообщение, теперь вы его видите   -  person Ammar0ah    schedule 17.09.2018


Ответы (1)


хорошо, поэтому уведомление о свойствах не происходит автоматически. Вам нужно вызвать этот код, чтобы вызвать событие. Это должно позаботиться о коде, но, не видя xaml, я не знаю, правильно ли настроена привязка.

public User User
{
    get { return App.TheUser; }
    set
    { 
        if(App.TheUser!= null)
        App.TheUser = value;
    }

    //User class 
    public class User : Base //Base class implements INotifyPropertyChanged
    {
        private int _id
        public int Id {
            get{
                return this._id;
            }
            set{
                this._id = value;
                OnPropertyChanged("Id");
            }
        }

        private string _name;
        public string Name {
            get{
                return this._name;
            }
            set{
                this._name = value;
                OnPropertyChanged("Name");
            }
        }

        private ObservableCollection<Product> _products;
        public ObservableCollection<Product> Products
        {
            get{
                return this._products;                
            }
            set{
                this._products = value;
                OnPropertyChanged("Products");
            }
        } 
    }
}

так что ваш список ни к чему не привязан ...

<ListView x:Name="UserListView"
          ItemsSource={Binding Products}
          SelectedItem="{Binding SelectedItemCommand}">
person Neil    schedule 17.09.2018
comment
Я добавил код Xaml .. Поставил ваш код и попробовал .. ничего не вышло: \ - person Ammar0ah; 17.09.2018
comment
ваш список не привязан к какому-либо свойству. Я обновил свой ответ, чтобы показать, как привязать источник элементов. - person Neil; 17.09.2018