Listview, используемый с ObservableCollection, не загружает последний элемент должным образом при удалении с той же страницы - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь отобразить список студентов в списке.Я использовал ObservableCollection в качестве ItemSource для моего списка, и когда я пытаюсь добавить его в коллекцию, он успешно отображается в пользовательском интерфейсе.Проблема возникает, когда я пытаюсь удалить элемент из коллекции, к которой я прикрепил изображения ниже.длина коллекции уменьшается на 1, что правильно, но этот элемент вообще не отображается.(если у меня есть n элементов в моей коллекции перед удалением, то также обнаруживается такое же поведение в том, что только последний элемент отображается некорректно, а все первые n-1 элементы отображаются должным образом)

xamarinссылка на форум для вопроса

Пожалуйста, перейдите по ссылке выше для подробного визуального описания проблемы.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

@ Cherry,

Я решил эту проблему на Android, но такое же решение не работает в iOS .

Ранее я использовал объект ObservableCollection в моей ViewModelи используя метод для возврата того же экземпляра в listView.Itemsource, как показано ниже,

В ViewModel:

private static ObservableCollection<Student> listofStds = new ObservableCollection<Student>();

public static ObservableCollection<Student> GetStudents()
{return listofStds;}

В представлении:

listView.ItemsSource = StudentsViewModel.GetStudents();

Теперь у меня есть код chnged вышес

В ViewModel:

class StudentsViewModel : INotifyPropertyChanged

private static List<Student> listofStds { get; set; }
public ObservableCollection<Student> listofStd
{
   get
   {
       return new ObservableCollection<Student>(listofStds);
   }
   set
  {
       //listofStds = value;
       OnPropertyChanged("listofStd");
   }
}

В представлении:

StudentsViewModel viewModel = new StudentsViewModel();

BindingContext = viewModel;
listView.SetBinding(ListView.ItemsSourceProperty, "listofStd");

В iOS, когда я запускаю тот же код, указанный ниже, указанные сообщения отображаются в окне отладки.

2019-02-13 16:52:14.323411+0530 NewStudentApp.iOS[90746:419211] SecTaskLoadEntitlements failed error=22 cs_flags=200, pid=90746
2019-02-13 16:52:14.323666+0530 NewStudentApp.iOS[90746:419211] SecTaskCopyDebugDescription: NewStudentApp.iO[90746]/0#-1 LF=0
0 голосов
/ 13 февраля 2019

Согласно вашему описанию, вы не помещаете некоторый код о том, как удалить элемент из Observablecollection, я думаю, что у вас могут быть некоторые проблемы при удалении элемента, я делаю один пример про удаление элемента из ListView, вы можете посмотреть:

 <ListView
            IsPullToRefreshEnabled="true"
            ItemSelected="OnSelection"
            ItemTapped="OnTap"
            ItemsSource="{Binding}"
            Refreshing="OnRefresh">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.ContextActions>
                            <!--
                                CommandParameter is the command to pass to the clicked event handler. Because these are menu items,
                                not cells managed by the ListView, CommandParameter is neccesary to determine which
                                cell the context action was taken on.
                            -->
                            <MenuItem
                                Clicked="OnMore"
                                CommandParameter="{Binding Name}"
                                Text="More" />
                            <MenuItem
                                Clicked="OnDelete"
                                CommandParameter="{Binding Name}"
                                IsDestructive="true"
                                Text="Delete" />
                        </ViewCell.ContextActions>
                        <StackLayout Padding="15,0">
                            <Label Text="{Binding Name}" />
                            <Label Text="{Binding Age}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>



[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Page2 : ContentPage
{
    public static ObservableCollection<student> items { get; set; }
    public Page2 ()
    {
        InitializeComponent ();
        items = new ObservableCollection<student>()
        {
            new student(){Name="Cherry",Age=12},
        new student() { Name = "Nock", Age = 13 },
        new student() { Name = "Mattew", Age = 13 }


        };
        this.BindingContext = items;
    }

    private void OnSelection(object sender, SelectedItemChangedEventArgs e)
    {

        if (e.SelectedItem == null)
        {
            return;
        }
        DisplayAlert("Item Selected", ((student)e.SelectedItem).Name.ToString(), "Ok");
    }

    private void OnTap(object sender, ItemTappedEventArgs e)
    {
        DisplayAlert("Item Tapped", ((student)e.Item).Name.ToString(), "Ok");
    }

    private void OnRefresh(object sender, EventArgs e)
    {
        var list = (ListView)sender;
        //put your refreshing logic here
        var itemList = items.Reverse().ToList();
        items.Clear();
        foreach (var s in itemList)
        {
            items.Add(s);
        }
        //make sure to end the refresh state
        list.IsRefreshing = false;
    }

    private void OnMore(object sender, EventArgs e)
    {
        var item = (MenuItem)sender;

        DisplayAlert("More Context Action", item.CommandParameter.ToString() + " more context action", "OK");
    }

    private void OnDelete(object sender, EventArgs e)
    {
        var item = (MenuItem)sender;
        student s = (from itm in items
                         where itm.Name == item.CommandParameter.ToString()
                         select itm)
              .FirstOrDefault<student>();
        items.Remove(s);

    }
}

public class student
{
    public string Name { get; set; }
    public Int32 Age { get; set; }
}
...