【问题标题】:Picker not select xamarin选择器不选择 xamarin
【发布时间】:2019-02-05 20:44:19
【问题描述】:

我有一个 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 库

https://www.youtube.com/watch?v=1OVnc_BMuZ8

【问题讨论】:

  • 你好@Ivan,我很惊讶你的代码可以编译。据我所知,您不能在未标有 async 关键字的方法中使用 await 。而且,如果 AddDadosViewModel 是 ViewModel 的 ctor,则不能将其标记为异步。您确定这是您正在运行的确切代码吗?

标签: xamarin xamarin.forms cross-platform mvvmcross picker


【解决方案1】:

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 的构造函数,则不能将其标记为异步,因为您不能将构造函数标记为异步。

无论如何,尝试实现我在这里解释的模式,它应该可以工作。

【讨论】:

  • Francesco,根据我发布的视频,比我的代码编译更糟糕的是,我实现了您的代码建议并在模拟器中编译并运行了应用程序,但在选择器中没有出现选择选项,当我单击选择器以选择一个选项时为空。我是这样做的:dropbox.com/s/olzwpc92o7q7m3o/Capturar.JPG?dl=0dropbox.com/s/61kxnrsciep9ush/picker.txt?dl=0
  • @Ivan,我尝试编写类似于您的原始代码的内容,但正如我所料,我得到了一个编译错误,正如您所看到的 here 。你不明白是很奇怪的。但是,抛开这个谜团-:),您的视图模型现在是否正确实现了 INotifyPropertyChanged?我没有看到 DadosPessoa、DadosAtividade 和 DadosInsumo 的二传手,所以我问一下,只是为了确定。
  • 你好@Ivan,我想我发现你的代码的主要问题:当你覆盖OnBindingContextChanged方法时,你没有调用基类的实现,所以@987654331您的视图的@ 未设置。这应该是您在选择器中看不到任何内容的原因!尝试在覆盖末尾添加:base.OnBindingContextChanged();
猜你喜欢
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2019-03-02
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
相关资源
最近更新 更多