将 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]);
}
- 确保,
GetNamesAsync()
returns 数据
- 确保您的 ViewModel 实现了
INotifyPropertyChanged
接口
- 确保在为名为
NamesListObsv
的变量赋值时触发 PropertyChanged
事件。
据我所知,当 NamesListObsv
获取值时,您没有通知用户界面。
首先,我从 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]);
}
- 确保,
GetNamesAsync()
returns 数据 - 确保您的 ViewModel 实现了
INotifyPropertyChanged
接口 - 确保在为名为
NamesListObsv
的变量赋值时触发PropertyChanged
事件。
据我所知,当 NamesListObsv
获取值时,您没有通知用户界面。