将 Picker ItemSource 绑定到列表 <string> 不起作用 Xamarin.forms MVVM

Binding Picker ItemSource to List<string> not working Xamarin.forms MVVM

首先,我从 firebase 云 Firestore 中检索一个数组。它是一个字符串数组。然后我将这些字符串添加到列表中。问题是当我尝试将选择器 ItemSource 绑定到字符串列表时,当我单击选择器时它不显示结果(它只是空白)。请在这里帮助我,我似乎找不到解决方案。代码如下:

在 ViewModel 中(相关部分):

public ObservableCollection<string> NamesListObsv { get; set; }

private List<string> _namesList;
public List<string> NamesList
    {
        get
        {
            return _namesList;
        }
        set
        {
            if (_namesList != value)
            {
                _namesList = value;
                OnPropertyChanged();
            }
        }
    }

NamesList = await GetNamesAsync();

NamesListObsv = new ObservableCollection<string>(NamesList);

public async Task<List<string>> GetNamesAsync()
    {
        try
        {

            var namesDoc = await CrossCloudFirestore.Current
                                                         .Instance
                                                         .Collection("names")
                                                         .Document("names_list")
                                                         .GetAsync();


            var namesList = namesDoc.ToObject<NamesModel>().NamesList;

            List<string> tempList = new List<string>();

            foreach (var names in namesList)
            {
                tempList.Add(name.ToString());
            }

            return tempList;

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return null;
        }          
    }

模特:

public class NamesModel
{
    [Id]
    public string Id { get; set; }

    [MapTo("name_array")]
    public List<string> NamesList { get; set; }

}

XAML(部分相关):

<Picker x:Name="NamesListPicker"
                            Title="Select your Name.."
                            ItemsSource="{Binding NamesListObsv}"
                            ItemDisplayBinding="{Binding .}"/>

但我得到的只是一个空的选择器,即使 NamesListObsv 包含三个名字([0]“bob”[1]“jim”[2]“john”)。任何建议将不胜感激。谢谢大家!

丢弃 NamesList 并将 NamesListObsv 重构为:

private ObservableCollection<string> _namesListObsv;
public ObservableCollection<string> NamesListObsv 
    {
        get
        {
            return _namesListObsv;
        }
        set
        {
            if (_namesListObsv!= value)
            {
                _namesListObsv= value;
                OnPropertyChanged();
            }
        }
    }


NamesListObsv = new ObservableCollection<string>(await GetNamesAsync());

Yet all I get is an empty Picker even though the NamesListObsv contains three names ([0] "bob" [1] "jim" [2] "john").

不要使用 NamesListObsv = new ObservableCollection<string>(NamesList);,尝试使用 foreach NamesList 将数据添加到 NamesListObsv。

   NamesListObsv = new ObservableCollection<string>();
        for(int i=0;i<NamesList.Count;i++)
        {
            NamesListObsv.Add(NamesList[i]);
        }
  1. 确保,GetNamesAsync() returns 数据
  2. 确保您的 ViewModel 实现了 INotifyPropertyChanged 接口
  3. 确保在为名为 NamesListObsv 的变量赋值时触发 PropertyChanged 事件。

据我所知,当 NamesListObsv 获取值时,您没有通知用户界面。