簡體   English   中英

如何獲取從服務獲取的ViewModel列表中的數據,然后更新View?

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

我有一個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));
    }
}

接口:

public ObservableCollection<ClassData> MyList { get; } 

VM(VM中也確實有一個INotifyPropertyChanged,但是由於它的升高屬性已從服務中更改,因此在此示例中是否需要使用它?):

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

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

XAML:

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

嘗試這樣的事情。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM