Почему элементы в ListView в Xamarin не исчезают после удаления объекта из связанного списка, даже если свойство ItemSource сброшено? - PullRequest
0 голосов
/ 10 января 2020

В настоящее время я изучаю Xamarin и нахожусь на стадии изучения ListView. Я заметил, что если я связываю ListView со списком и удаляю из него элемент, то просмотр списка не будет отображать это изменение. Я понял, что мне нужно использовать ObservableCollection, чтобы он работал автоматически (или иметь коллекцию, реализующую надлежащий интерфейс), но я просто хотел бы понять, почему это не работает, даже когда я сбрасываю свойство ItemsSource ListView после удаления. Вот код:

 namespace Lists
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ListsOne : ContentPage
    {
       List<Contact> _contacts = new List<Contact> {
                    new Contact{ Name = "Mosh", Number = "1234566", ImageUrl="http://lorempixel.com/100/100/people/1"},
                    new Contact { Name = "Josh", Number = "1236578" , ImageUrl = "http://lorempixel.com/100/100/people/2"}};

        IEnumerable<Contact> GetContacts(string searchText = null)
        {  

            if (String.IsNullOrWhiteSpace(searchText))
            {
                return _contacts;
            }

            return _contacts.Where(c => c.Name.StartsWith(searchText));
        }

        public ListsOne()
        {
            InitializeComponent();            
            listView.ItemsSource = GetContacts();
        }       

        private void Delete_Clicked(object sender, EventArgs e)
        {
            Contact contact = (sender as MenuItem).CommandParameter as Contact;
            _contacts.Remove(contact);
            listView.ItemsSource = GetContacts();

        }

        private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
        {
            listView.ItemsSource = GetContacts(e.NewTextValue);
        }
    }
}

Как вы можете видеть в методе Delete_Clicked, после удаления контакта из _contacts я сбрасываю ItemsSource, но это не повлияет на приложение, даже при том, что реализация практически такая же. для SearchBar_TextChanged работает (если я правильно помню, я сейчас на работе). Любое понимание того, как это работает? Извините, если это глупо, но я только учусь.

Ответы [ 2 ]

1 голос
/ 10 января 2020

Заменить список на ObservableCollection. У последних есть событие, которое уведомляет пользовательский интерфейс об изменениях в его массиве. (Это когда вы используете MVVM, в вашем примере это может быть неприменимо).

Кроме того, насколько мне известно, существует проблема с ListView.ItemSource при добавлении в него удаляемых элементов. Чтобы заставить это работать, сделайте это:

        private void Delete_Clicked(object sender, EventArgs e)
    {
        Contact contact = (sender as MenuItem).CommandParameter as Contact;
        _contacts.Remove(contact);
        listView.ItemsSource = null;
        listView.ItemsSource = GetContacts();

    }
0 голосов
/ 13 января 2020

В документе listview-ItemsSource написано:

Если вы хотите, чтобы ListView автоматически обновлялся по мере добавления, удаления и изменения элементов в базовом списке, вам нужно будет использовать ObservableCollection. ObservableCollection определено в System.Collections.ObjectModel и аналогично List, за исключением того, что оно может уведомлять ListView о любых изменениях:

ObservableCollection<Employee> employees = new ObservableCollection<Employee>();
listView.ItemsSource = employees;

//Mr. Mono will be added to the ListView because it uses an ObservableCollection
employees.Add(new Employee(){ DisplayName="Mr. Mono"});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...