首页 > 解决方案 > 如何将数据获取到从服务获取的 ViewModel 列表,然后更新 View?

问题描述

我有一个 MVVM 问题。

我成功地收集了数据,在我的虚拟机中创建了一个 IoC 容器并将其绑定到我的视图。我遇到的问题是视图不会更新其 UI,除非我导航到某个地方然后返回。然后填充列表。请参阅下面的逻辑:

服务:

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,但是我是否需要在这个示例中使用它,因为它的 raisepropertychanged 从服务中改变了?):

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

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

XAML:

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

标签: c#mvvmxamarin.forms

解决方案


尝试这样的事情。

XAML:

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

视图模型

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.

第二种解决方案。

// 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));
}

推荐阅读