将 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<string>(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
接口
确保在为名为@987654323@ 的变量赋值时,PropertyChanged
事件被触发。
据我所知,当NamesListObsv
获得值时,您没有通知用户界面。
【讨论】:
感谢您抽出宝贵时间查看此问题。 1.它确实正确返回数据。 2. vm 确实实现了 PropertyChanged()。 3.我没有通知似乎是哪个问题,我接受了lidqy的回答,因为它完美地解决了这个问题:)。以上是关于将 Picker ItemSource 绑定到 List<string> 不起作用 Xamarin.forms MVVM的主要内容,如果未能解决你的问题,请参考以下文章
如何设置控件属性(在DataTemplate和UserControl中)的绑定以使用ItemSource的给定属性?