简体   繁体   English

如何获取从服务获取的ViewModel列表中的数据,然后更新View?

[英]How to get data to ViewModel list that is acquired from a service and then update the View?

I have a MVVM question. 我有一个MVVM问题。

I am successfully gathering data, creating an IoC container in my VM and binding it to my view. 我已成功收集数据,在VM中创建了一个IoC容器并将其绑定到视图。 The issue I am having is that the view doesnt update its UI unless i navigate somewhere and then go back. 我遇到的问题是,除非我导航到某个地方然后返回,否则视图不会更新其UI。 Then the list is populated. 然后,将填充列表。 See my logic below: 请参阅下面的逻辑:

Service: 服务:

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

Interface: 接口:

public ObservableCollection<ClassData> MyList { get; } 

VM (I do have a INotifyPropertyChanged in the VM as well, but do I need to use that in this example since its raisingpropertychanged from the service?): VM(VM中也确实有一个INotifyPropertyChanged,但是由于它的升高属性已从服务中更改,因此在此示例中是否需要使用它?):

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

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

XAML: XAML:

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

Try something like this. 尝试这样的事情。

XAML: 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.

2nd Solution. 第二解决方案。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM