C# 如何将从服务获取的数据获取到ViewModel列表,然后更新视图?

C# 如何将从服务获取的数据获取到ViewModel列表,然后更新视图?,c#,mvvm,xamarin.forms,C#,Mvvm,Xamarin.forms,我有一个MVVM问题 我正在成功地收集数据,在VM中创建IoC容器并将其绑定到视图。我遇到的问题是,除非我导航到某个地方然后返回,否则视图不会更新其UI。然后填充列表。请看下面我的逻辑: 服务: public ObservableCollection<ClassData> _MyList; public ObservableCollection<ClassData> MyList { get { return _MyList; }

我有一个MVVM问题

我正在成功地收集数据,在VM中创建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));
    }
}
publiccobservecollection\u MyList;
公共可观测集合MyList
{
收到
{
返回我的列表;
}
专用设备
{
_MyList=值;
RaisePropertyChanged(“MyList”);
}
}
异步任务LoadData()
{
var top=await cloudService.GetData().ConfigureAwait(false);
MyList=top.results;
}
公共事件属性更改事件处理程序属性更改;
public void RaisePropertyChanged(字符串propName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新PropertyChangedEventArgs(propName));
}
}
接口:

public ObservableCollection<ClassData> MyList { get; } 
publicobservableCollection MyList{get;}
VM(我在VM中也有一个INotifyPropertyChanged,但是在这个示例中,我是否需要使用它,因为它的raisingpropertychanged来自服务?):

public observeCollection ViewModelList=>this.service.MyList;
私人只读设备服务;
公共MyViewModel(iSeries服务)
{
服务=服务;
}
XAML:


试试这样的方法

XAML:

第二种解决方案

// When _service is changed.
_service.PropertyChanged += Service_PropertyChanged;

尝试通过service
binding service.MyList进行绑定,并在服务发生更改时引发服务的属性更改事件。或者,您可以将处理程序附加到service.PropertyChangedEventHandler,然后为
ViewModelList
引发notify change。绑定service.MyList失败。如果这能奏效,那么它肯定是最好的解决方案。第二种选择是什么意思?如果您可以展示一个非常值得欣赏的示例“并在服务发生更改时为其引发属性更改事件”-意味着像示例中一样保留
MyList
,对吗?我现在有,但看不到成功。我想解决方案1在设计方面是最好的?然后不必清理viewmodel上的任何内容。我们可以在服务中添加idisposable
<ListView ItemsSource = {Binding ViewModelList} ... >
<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));
}