Xamarin.Forms C# Picker 和元组列表不显示任何内容

问题描述

我的问题是在 Xamarin.Forms 中使用 C# for Android 项目。 我正在尝试在选择器中显示元组列表以选择其中之一。我在 ObservableCollection (int ID,string Name) 中使用元组ObservableCollection<(int ID,string Name)> BLA => new ObservableCollection<(int ID,string Name)>(); 表示法。

遗憾的是,<Picker ItemsSource="{Binding BLA}" ItemdisplayBinding="{Binding Item2}"/><Picker ItemsSource="{Binding BLA}" ItemdisplayBinding="{Binding Name}"/> 都没有在选择弹出窗口中显示元组名称属性

ObservableCollection<Tuple<int,string>> blat => new ObservableCollection<Tuple<int,string>>(); 这样的“旧”方式适用于 <Picker ItemsSource="{Binding blat}" ItemdisplayBinding="{Binding Item2}"/>

Xamarin 尚不支持元组的第一种方式还是我必须先设置一些东西?

解决方法

还可以通过使用数据绑定将其 ItemsSource 属性绑定到 IList 集合来填充数据。

请注意,ItemsSource 集合中的每个项目都是对象类型,因此必须强制转换为字符串以进行显示。

通常,我会创建一个包含一些属性的模型类,以便在 xaml 中进行绑定。

 public class model
{
    public int Id { get; set; }
    public string Name { get; set; }
}

 public partial class Page2 : ContentPage
{
    public ObservableCollection<model> listdata { get; set; }
    public Page2()
    {
        InitializeComponent();
        listdata = new ObservableCollection<model>()
        {
            new model(){Id=1,Name="model 1"},new model(){Id=2,Name="model 2"},new model(){Id=3,Name="model 3"},new model(){Id=4,Name="model 4"}
        };
        this.BindingContext = this;
    }
}

当绑定到一个对象列表时,必须告诉选择器从每个对象显示哪个属性。这是通过将 ItemDisplayBinding 属性设置为每个对象所需的属性来实现的。在上面的代码示例中,选择器设置为显示每个 model.Name 属性值。

<Picker
            Title="Select a model"
            ItemDisplayBinding="{Binding Name}"
            ItemsSource="{Binding listdata}"
            TitleColor="Red" />

更新:

如果不想使用自定义类,可以使用 Dictionary 来存储数据。

 public partial class Page2 : ContentPage
{      
    public static  Dictionary<string,int> colors { get; }= new Dictionary<string,int>
    {
        { "model1",6 },{ "model2",1 },{ "model3",2 },{ "model4",3 },{ "model5",4 },{ "model6",5 }
    };
    public List<string> Colors { get; } = colors.Keys.ToList();

  
    public Page2()
    {
        InitializeComponent();
     
        this.BindingContext = this;
    }
}

  <Picker
            Title="Select a model"
            ItemsSource="{Binding Colors}"
            TitleColor="Red" />