Развернуть элемент списка на элементе - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать расширяемый элемент списка, когда я нажимаю на имя элемента ... проблема в том, что значение IsVisiable изменяется, но оно не отражается на странице и остается неизменным (только имяэлемента показаны не все скрытые детали).

Сначала я добавил реквизит IsVisiable для своей модели

public class Item
{
    public int Id { get; set; }

    public string UserId { get; set; }

    public string Name { get; set; }

    public string Category { get; set; }

    public string Quality { get; set; }

    public int Size { get; set; }

    public decimal Price { get; set; }

    public bool IsVisiable { get; set; }

}

Это страница содержимого

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:viewModels="clr-namespace:XamarinApp.ViewModels;assembly=XamarinApp"
         x:Class="XamarinApp.ViewModels.Views.CustomerProfilePage">

<ContentPage.BindingContext>
    <viewModels:CustomerProfileViewModel/>
</ContentPage.BindingContext>

        <ListView ItemsSource="{Binding Items}" 
                  HasUnevenRows="True"
                  ItemTapped="ListView_OnItemTapped">


            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Label Text="{Binding Name}" ></Label>
                            <StackLayout IsVisible="{Binding IsVisiable}">

                            <Label Text="{Binding Category}" ></Label>
                            <Label Text="{Binding Quality}" ></Label>
                            <Label Text="{Binding Size}" ></Label>
                            <Label Text="{Binding Price} "></Label>
                            </StackLayout>

                            <!--   <Label Text="المسافة بينك وبين العميل"></Label> -->


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

Я создаю метод onItemTapped

    public partial class CustomerProfilePage : ContentPage
{
    public CustomerProfilePage (string userId)
    {

        InitializeComponent ();
        this.BindingContext = new CustomerProfileViewModel(userId); 

    }


    private void ListView_OnItemTapped(object sender, ItemTappedEventArgs e)
    {
        var vm = BindingContext as CustomerProfileViewModel;
        var Item = e.Item as Item;
        vm?.HideOrShowItem(Item);
    }
}

Затем я добавил метод элемента HideOrShow для управления в моей виртуальной машине

public class CustomerProfileViewModel:INotifyPropertyChanged
{
    public CustomerProfileViewModel()
    {

    }

    public CustomerProfileViewModel(string cutomerId)
    {
        CustomerId = cutomerId;

        if (GetItems.CanExecute(null))
            GetItems.Execute(null);
    }

    public List<Item> Items
    {
        get => _items;
        set
        {

            if (Equals(value, _items)) return;
            _items = value;

            OnPropertyChanged();
        }
    }

    public string CustomerId { get;}

    private List<Item> _items;

    private Item _oldItem;

    ApiServices _apiServices = new ApiServices();




    public void HideOrShowItem(Item item)
    {

        if (_oldItem == item)
        {
            item.IsVisiable = !item.IsVisiable;
            UpdateItems(item);
        }
        else
        {
            if (_oldItem != null)
            {
                _oldItem.IsVisiable = false;
                UpdateItems(_oldItem);
            }

            item.IsVisiable = true;
            UpdateItems(item);
        }

        _oldItem = item;
    }

    private void UpdateItems(Item item)
    {
        var index = Items.IndexOf(item);
        Items.Remove(item);
        Items.Insert(index, item);


    }

    public ICommand GetItems
    {
        get
        {
            return new Command(async () =>
            {
                var accesstoken = Settings.AccessToken;
                Items = await _apiServices.GetItemsForSpecificUser(accesstoken, CustomerId);

            });
        }
    }


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


}

1 Ответ

0 голосов
/ 31 мая 2018

Проблемы, которые я вижу:

  • Ваш класс Item должен реализовывать INotifyPropertyChanged интерфейс
  • Я также вижу, что вы можете обновить свой список Items.Таким образом, чтобы отразить изменения списка в вашем пользовательском интерфейсе, Items должен быть ObservableCollection<Item>

Обновленный класс Item (должен выглядеть примерно так):

    public class Item : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private int _id;
        private bool _isVisible;
        // . . .

        public int Id
        {
            get => _id;
            set
            {
                if (_id != value)
                {
                    _id = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Id)));
                }
            }
        }
        public bool IsVisible
        {
            get => _isVisible;
            set
            {
                if (_isVisible != value)
                {
                    _isVisible = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.IsVisible)));
                }
            }
        }
    // . . . Other properties

И вВаш ViewModel, объявите список элементов:

private ObservableCollection<Item> _items;

public ObservableCollection<Item> Items{
    get => _items;
    private set{
        _items = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Items)));
    }
}

Попробуйте с этим и скажите нам, если это нормально ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...