【问题标题】:Xamarin.Forms C# Picker and Lists of Tuples not displaying anythingXamarin.Forms C# 选择器和元组列表不显示任何内容
【发布时间】:2021-04-28 08:24:32
【问题描述】:

我的问题出在带有 C# for Android 项目的 Xamarin.Forms 中。 我正在尝试在选择器中显示元组列表以选择其中一个。我在 ObservableCollection ObservableCollection<(int ID, string Name)> BLA => new ObservableCollection<(int ID, string Name)>(); 中使用元组的 (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 尚不支持元组的第一种方式还是我必须先设置一些东西?

【问题讨论】:

  • 我不认为数据绑定像第一个示例那样适用于匿名类型。你可以使用 Tuple 类来实现同样的事情
  • 谢谢,我认为由于 C# 7 Tuple<int, string> 应该与本文所述的 (int ID, string) 相同:C# 7.0: Tuples Explained
  • @LarsR 也许,我们期待。

标签: c# android xamarin xamarin.forms


【解决方案1】:

Picker 也可以通过使用数据绑定将其 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;
    }
}

当绑定到对象列表时,必须告诉 Picker 显示每个对象的哪个属性。这是通过将ItemDisplayBinding 属性设置为每个对象的所需属性来实现的。在上面的代码示例中,Picker 被设置为显示每个 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" />

【讨论】:

  • 感谢您的回答,但我认为您在这里忽略了我的观点。我明确不想为我的显示使用自定义类,因为数据只是一次性数据,并且包含少量项目的元组会更有效。我想使用 (int ID, string Name) 表示法的唯一原因是,使用命名项目比始终使用项目 1 和项目 2 更好地进行故障排除。
  • @LarsR 我认为 Xamarin 不支持您提到的第一种方式,如果您不想使用自定义类,可以考虑使用 Dictionary,请参阅我的更新。
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 2018-11-17
  • 2012-03-30
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多