Как получить данные для списка ViewModel, полученные из службы, а затем обновить вид? - PullRequest
0 голосов
/ 27 марта 2019

У меня вопрос MVVM.

Я успешно собираю данные, создаю контейнер IoC в моей виртуальной машине и привязываю его к своему представлению.Проблема, с которой я столкнулся, заключается в том, что представление не обновляет свой пользовательский интерфейс, если я не переместился куда-то, а затем вернулся назад.Затем список заполняется.См. Мою логику ниже:

Служба:

public ObservableCollection<ClassData> _MyList;
public ObservableCollection<ClassData> MyList
{
    get
    {
        return _MyList;
    }
    private set
    {
        _MyList = value;
        RaisePropertyChanged("MyList");
    }
}

async Task LoadData()
{
    var top = await cloudService.GetData().ConfigureAwait(false);
    MyList = top.results;
}

public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}

Интерфейс:

public ObservableCollection<ClassData> MyList { get; } 

ВМ (у меня также есть INotifyPropertyChanged в ВМ, но мне нужноиспользовать это в этом примере, поскольку его поднятие свойства изменено из службы?):

 public ObservableCollection<ClassData> ViewModelList => this.service.MyList;

 private readonly IService service;
 public MyViewModel (IService service)
 {
   this.service = service;
 }

XAML:

<ListView ItemsSource = {Binding ViewModelList} ... >

1 Ответ

1 голос
/ 27 марта 2019

Попробуйте что-то вроде этого.

XAML:

<ListView ItemsSource="{Binding Service.MyList}" />

ViewModel

private IService _service;
public IService Service
{
   get => _service;
   set
   {
       _service = value;
       RaisePropertyChanged(nameof(Service));
       // So whenever _service is changed, it will generate an event.
       // UI will get Service.MyList.
   }
}

// No Observable collection.

2-е решение.

// When _service is changed.
_service.PropertyChanged += Service_PropertyChanged;
// Manually raise event to update list.
private void Service_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "MyList")
        OnPropertyChanged(nameof(ViewModelList));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...