[英]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.