Xamarin Forms связывает продукты с учетными записями пользователей - PullRequest
0 голосов
/ 17 сентября 2018

Я делаю приложение для покупок, оно имеет учетную запись для пользователя, и когда пользователь покупает продукт, оно должно быть добавлено в просмотр списка в его учетной записи.Поэтому я попытался поместить статический объект класса пользователя, который имеет список продуктов, и всякий раз, когда пользователь нажимает кнопку покупки, он должен быть добавлен в список.В то же время 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>

1 Ответ

0 голосов
/ 17 сентября 2018

нормально, поэтому уведомление о недвижимости не происходит автоматически.Вам нужно вызвать этот код, чтобы вызвать событие.Это должно заботиться о коде, но не видя 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}">
...