c# - 如何将数据获取到从服务获取的 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} ... >
解决方案
尝试这样的事情。
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));
}
推荐阅读
- r - l/sapply 忽略条件替换
- spring-cloud - 从外部服务中提取跟踪 id
- mysql - LEFT JOIN - 使用左连接返回空结果作为 payment_method 的总和
- c# - 3 个表...一个数据网格?C# 与 SQL Server 和 IIS ...?
- java - 逐字符添加Java字符串的空间复杂度
- vb.net - 阻止用户关闭 Selenium 驱动的 Firefox
- spring - 如何从 spring webflux 控制器中捕获异常?
- apache-spark - 引擎盖下 SPARK 数据框优化
- sharepoint - SharePoint CAML 或
- javascript - 如何为 window.location.pathname 实现通配符