我使用的是3屏幕选择器,但下面的视频让我们首先回顾其中的一个。
在我的模型视图中。
public ObservableCollection<string> DadosPessoa { get; }
private dbo_registro_dado _dado;
public dbo_registro_dado Dado
{
get => _dado;
set => SetProperty(ref _dado, value);
}
public AddDadosViewModel(dbo_registro_dado registro)
{
var contentsPessoa = await App.DadosRepo.GetAllDadosPessoaAsync();
DadosPessoa.Clear();
foreach (var d in contentsPessoa)
{
DadosPessoa.Add(d.nomePessoa);
}
Dado = registro;
}
在我的页面xaml
<Label Text="{Binding Dado.pessoa}" ></Label>
<Picker Title="Pessoa" ItemsSource="{Binding DadosPessoa}" SelectedItem="{Binding Dado.pessoa}" />
当我拨打电话并进入屏幕时,有时会显示为选中状态,而有时却没有出现,请在我在选择器上方添加标签的视频中查看,以确保显示哪些信息
这是因为数据加载延迟,我该怎么办才能解决此问题?
请记住,填充选择器的数据来自内部sqlite库
答案 0 :(得分:0)
View等待ViewModel中的异步操作的正确方法是将对异步操作的调用放入标记为异步的ViewModel方法中,并返回Task:
public async Task LoadDataAsync(dbo_registro_dado registro)
{
var contentsPessoa = await App.DadosRepo.GetAllDadosPessoaAsync();
DadosPessoa.Clear();
foreach (var d in contentsPessoa)
{
DadosPessoa.Add(d.nomePessoa);
}
Dado = registro;
}
然后从View调用async方法,等待它:
await vm.LoadDataAsync(registro);
其中vm
是对ViewModel的引用,registro
是您需要传递的参数。
如果您自己不实例化ViewModel(例如,使用依赖注入),或者在View的构造函数中实例化(不能使用await关键字),则可以重写OnBindingContextChanged方法,如下所示:
protected override async void OnBindingContextChanged()
{
if (BindingContext is YourViewModel vm) {
await vm.LoadDataAsync();
}
base.OnBindingContextChanged();
}
老实说,我怀疑您发布的代码是否可以编译,因为您尝试等待未标记为异步的方法中的异步操作。此外,如果AddDadosViewModel
是ViewModel的构造函数,则yon无法将其标记为异步,因为您不能将构造函数标记为异步。
无论如何,尝试实现我在此说明的模式,它应该可以工作。