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

Posted

技术标签:

【中文标题】将 Picker ItemSource 绑定到 List<string> 不起作用 Xamarin.forms MVVM【英文标题】:Binding Picker ItemSource to List<string> not working Xamarin.forms MVVM 【发布时间】:2021-09-17 12:36:12 【问题描述】:

首先,我从 firebase cloud 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"),但我得到的只是一个空的 Picker。任何建议将不胜感激。谢谢大家!

【问题讨论】:

你试过 ObservableCollection 了吗? NamesListObsv 的设置器中没有OnPropertyChanged();。这就是为什么。 首先,您确定NamesListObsv 包含数据吗?其次,如果数据只是string,我不相信你需要ItemDisplayBinding 【参考方案1】:

丢弃 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());

【讨论】:

感谢您的帮助!准点!【参考方案2】:

尽管 NamesListObsv 包含三个名称([0] "bob" [1] "jim" [2] "john"),但我得到的只是一个空的 Picker。

不要使用NamesListObsv = new ObservableCollection&lt;string&gt;(NamesList);,尝试foreach NamesList向NamesListObsv添加数据。

   NamesListObsv = new ObservableCollection<string>();
        for(int i=0;i<NamesList.Count;i++)
        
            NamesListObsv.Add(NamesList[i]);
        

【讨论】:

感谢您的建议 :) 我选择了 lidqy 的回答,因为它似乎是最干净 + 最简单的选择。【参考方案3】:
    确保GetNamesAsync() 返回数据 确保您的 ViewModel 实现了INotifyPropertyChanged 接口 确保在为名为@9​​87654323@ 的变量赋值时,PropertyChanged 事件被触发。

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

【讨论】:

感谢您抽出宝贵时间查看此问题。 1.它确实正确返回数据。 2. vm 确实实现了 PropertyChanged()。 3.我没有通知似乎是哪个问题,我接受了lidqy的回答,因为它完美地解决了这个问题:)。

以上是关于将 Picker ItemSource 绑定到 List<string> 不起作用 Xamarin.forms MVVM的主要内容,如果未能解决你的问题,请参考以下文章

如何设置控件属性(在DataTemplate和UserControl中)的绑定以使用ItemSource的给定属性?

DataContext和ItemSource

将 SwiftUI Picker 绑定到字典中保存的值

Xamarin 如何将类属性(来自另一个项目)绑定到 Picker.ItemDisplayBinding 属性

Picker的动态ItemDisplayBinding

如果 itemsource 中不存在值,则组合框分配 null