【发布时间】:2018-02-12 05:47:35
【问题描述】:
我的 ViewModel 有一个 30 秒的数据刷新服务委托方法:
public Task OnDataRefreshed(List<MyType> data)
{
this.Data = data;
LongRunningGetDetailsAsync();
return Task.FromResult(0);
}
公共属性Data 在视图中正确显示和刷新。
此处的目的不是等待异步任务(即发即弃)LongRunningGetDetailsAsync(),因为如果执行同步,它将在显示Data 之前引入显着延迟。我想尽快显示Data,然后让异步任务按照自己的节奏获取详细信息,然后让视图绑定赶上。
private async Task LongRunningGetDetailsAsync()
{
foreach (MyType dataitem in this.Data)
{
dataitem.Details = await _apiEndpointService.GetDetails(dataitem.Id);
}
}
LongRunningGetDetailsAsync() 是绑定未触发的位置。我在LongRunningGetDetailsAsync 的末尾设置了一个断点,观看 Data.Details - Data.Details 在那里,但它从未显示在视图中。
提前感谢您的宝贵时间!
编辑: 改为
public async Task OnDataRefreshed(ObservableCollection<MyType> data)
{
this.Data = data;
await LongRunningGetDetailsAsync();
}
- 仍然有同样的问题。
Data绑定到Mvx.MvxListView。如果列表很长并且某个项目碰巧不在视线范围内,则一旦滚动到它,它就会显示更新后的模型 OK。
“数据”:
public class MyType
{
public string MyProperty { get; set; }
public string Details { get; set; }
}
private ObservableCollection<MyType> _data;
public ObservableCollection<MyType> Data
{
get { return _data; }
set
{
if (SetProperty(ref _data, value))
{
RaisePropertyChanged(() => Data);
}
}
}
视图绑定:
<Mvx.MvxListView
local:MvxBind="ItemsSource Data"
local:MvxItemTemplate="@layout/listitem"
... />
列表项:
<TextView local:MvxBind="Text MyProperty" ...
<TextView local:MvxBind="Text Details" ...
【问题讨论】:
-
你使用的是
INotifyPropertyChanged接口吗?Details的属性怎么样? -
@Default 细节是原始的 - 请参阅上面的编辑
-
您需要在 PropertyChanged 更改时触发它。您能否在视图中添加如何绑定它?
-
@Default
RaisePropertyChanged(() => Data);onset,查看 - 请参阅上面的补充 -
是的,好吧,您需要在
Details属性上使用它 - 这是一个变化。你的Data没有(在电话Details = ..中)。此外,尽量避免为您的收藏设置二传手。如果您需要添加新数据,请改用Clear和Add[Range]。
标签: c# asynchronous xamarin mvvmcross