Xamarin Forms ListView остается пустым после заполнения источника - PullRequest
0 голосов
/ 10 марта 2020

У меня проблема. Я создал ListView с источником данных List с именем unknownDeviceList из моей ViewModel. Вот моя ViewModel:

public class VM_AddDeviceList : BindableObject
{
    private List<UnknownDevice> _unknownDeviceList;
    public List<UnknownDevice> unknownDeviceList
    {
        get
        {
            return _unknownDeviceList;
        }
        set
        {
            if (_unknownDeviceList != value)
            {
                _unknownDeviceList = value;
                OnPropertyChanged();
            }
        }
    }

    public List<UnknownDevice> deviceList_raw;

    public VM_AddDeviceList()
    {
        deviceList_raw = new List<UnknownDevice>();
        unknownDeviceList = new List<UnknownDevice>();
        MyHandler();
    }

    private async Task LoadUnknownDeviceList()
    {
        deviceList_raw = await App.RestService.GetDevices();

        foreach (UnknownDevice device in deviceList_raw)
        {
            bool containsItem = App.knownDeviceList.Any(item => item.MAC == device.MAC);

            if (!containsItem)
            {
                unknownDeviceList.Add(device);
            }
        }
    }

    public Task MyHandler()
    {
        return LoadUnknownDeviceList();
    }
}

Теперь я вижу, что unknownDeviceList заполняется в foreach, но на экране ListView остается пустым. Что я делаю неправильно? Что-то с асин c и ждут?

1 Ответ

0 голосов
/ 10 марта 2020

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

Самый идиоматический c способ решения проблемы - использовать ObservableCollection<string>.

private ObservableCollection<string> _unknownDevices = new ObservableCollection<string>();

public ObservableCollection<string> UnknownDevices => _unknownDevices;

Обратите внимание что я использовал синтаксис тела выражения для свойств только для чтения для UnknownDevices, это не поле.

Поскольку ObservableCollection<string> реализует INotifyCollectionChanged на которую можно подписаться с помощью привязки к UnknownDevices, представление информируется об изменениях в UnknownDevices и будет обновляться при добавлении или удалении любых элементов.

...