Compartir a través de


Configuración de la propiedad ItemsSource de un selector

La vista Selector es un control para seleccionar un elemento de texto de una lista de datos. En este artículo se explica cómo rellenar un Selector con datos estableciendo la propiedad ItemsSource y cómo responder a la selección de elementos por parte del usuario.

Xamarin.Forms 2.3.4 ha mejorado la vista Picker agregando la capacidad de rellenarla con datos estableciendo su propiedad ItemsSource y para recuperar el elemento seleccionado de la propiedad SelectedItem. Además, el color del texto del elemento seleccionado se puede cambiar estableciendo la propiedad TextColor en Color.

Rellenando de un selector con datos

Picker se puede rellenar con datos estableciendo su propiedad ItemsSource en una colección IList. Cada elemento de la colección debe ser de object o derivado de este tipo. Se agregan elementos en XAML mediante la inicialización de la propiedad ItemsSource a partir de una matriz de elementos.

<Picker x:Name="picker"
        Title="Select a monkey"
        TitleColor="Red">
  <Picker.ItemsSource>
    <x:Array Type="{x:Type x:String}">
      <x:String>Baboon</x:String>
      <x:String>Capuchin Monkey</x:String>
      <x:String>Blue Monkey</x:String>
      <x:String>Squirrel Monkey</x:String>
      <x:String>Golden Lion Tamarin</x:String>
      <x:String>Howler Monkey</x:String>
      <x:String>Japanese Macaque</x:String>
    </x:Array>
  </Picker.ItemsSource>
</Picker>

Nota:

Tenga en cuenta que el elemento x:Array requiere un atributo Type que indica el tipo de los elementos de la matriz.

El código de C# equivalente se muestra a continuación:

var monkeyList = new List<string>();
monkeyList.Add("Baboon");
monkeyList.Add("Capuchin Monkey");
monkeyList.Add("Blue Monkey");
monkeyList.Add("Squirrel Monkey");
monkeyList.Add("Golden Lion Tamarin");
monkeyList.Add("Howler Monkey");
monkeyList.Add("Japanese Macaque");

var picker = new Picker { Title = "Select a monkey", TitleColor = Color.Red };
picker.ItemsSource = monkeyList;

Respondiendo a la selección de elementos

Picker admite la selección de un elemento a la vez. Cuando un usuario selecciona un elemento, el evento SelectedIndexChanged se desencadena, la propiedad SelectedIndex se actualiza a un entero que representa el índice del elemento seleccionado en la lista, y la propiedad SelectedItem se actualiza al elemento object que representa el elemento seleccionado. La propiedad SelectedIndex es un número de base cero que indica el elemento seleccionado por el usuario. Si no se selecciona ningún elemento, que es el caso cuando Picker se crea e inicializa por primera vez, SelectedIndex será -1.

Nota:

El comportamiento de selección de elementos en Picker se puede personalizar en iOS con un elementos específico de la plataforma. Para más información, consulte Control de la selección de elementos del selector.

En el ejemplo de código siguiente se muestra cómo recuperar el valor de propiedad SelectedItem de Picker en XAML:

<Label Text="{Binding Source={x:Reference picker}, Path=SelectedItem}" />

El código de C# equivalente se muestra a continuación:

var monkeyNameLabel = new Label();
monkeyNameLabel.SetBinding(Label.TextProperty, new Binding("SelectedItem", source: picker));

Además, se puede ejecutar un controlador de eventos cuando se desencadena el evento SelectedIndexChanged:

void OnPickerSelectedIndexChanged(object sender, EventArgs e)
{
  var picker = (Picker)sender;
  int selectedIndex = picker.SelectedIndex;

  if (selectedIndex != -1)
  {
    monkeyNameLabel.Text = (string)picker.ItemsSource[selectedIndex];
  }
}

Este método obtiene el valor de propiedad SelectedIndex y usa el valor para recuperar el elemento seleccionado de la colección ItemsSource. Esto es funcionalmente equivalente a recuperar el elemento seleccionado de la propiedad SelectedItem. Tenga en cuenta que todos los elementos de la colección ItemsSource son de tipo object y, por tanto, debe convertirse en string para mostrarlos.

Nota:

Picker se puede inicializar para mostrar un elemento específico estableciendo las propiedades SelectedIndex o SelectedItem. Sin embargo, estas propiedades deben establecerse después de inicializar la colección ItemsSource.

Rellenar un selector con datos mediante un enlace de datos

También Picker se puede rellenar con datos mediante el enlace de datos para vincular su propiedad ItemsSource a una colección IList. En XAML, esto se consigue mediante la extensión de marcado Binding:

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

El código de C# equivalente se muestra a continuación:

var picker = new Picker { Title = "Select a monkey", TitleColor = Color.Red };
picker.SetBinding(Picker.ItemsSourceProperty, "Monkeys");
picker.ItemDisplayBinding = new Binding("Name");

Los datos de la propiedad ItemsSource se enlazan a la propiedad Monkeys del modelo de vista conectado, que devuelve una colección IList<Monkey>. En el ejemplo de código siguiente se muestra la clase Monkey, que contiene cuatro propiedades:

public class Monkey
{
  public string Name { get; set; }
  public string Location { get; set; }
  public string Details { get; set; }
  public string ImageUrl { get; set; }
}

Al enlazar a una lista de objetos, se debe indicar a Picker qué propiedad se va a mostrar de cada objeto. Esto se logra estableciendo la propiedad ItemDisplayBinding en la propiedad necesaria de cada objeto. En los ejemplos de código anteriores, Picker se establece para mostrar cada valor de propiedad Monkey.Name.

Respondiendo a la selección de elementos

El enlace de datos se puede usar para establecer un objeto en el valor de propiedad SelectedItem cuando cambia:

<Picker Title="Select a monkey"
        TitleColor="Red"
        ItemsSource="{Binding Monkeys}"
        ItemDisplayBinding="{Binding Name}"
        SelectedItem="{Binding SelectedMonkey}" />
<Label Text="{Binding SelectedMonkey.Name}" ... />
<Label Text="{Binding SelectedMonkey.Location}" ... />
<Image Source="{Binding SelectedMonkey.ImageUrl}" ... />
<Label Text="{Binding SelectedMonkey.Details}" ... />

El código de C# equivalente se muestra a continuación:

var picker = new Picker { Title = "Select a monkey", TitleColor = Color.Red };
picker.SetBinding(Picker.ItemsSourceProperty, "Monkeys");
picker.SetBinding(Picker.SelectedItemProperty, "SelectedMonkey");
picker.ItemDisplayBinding = new Binding("Name");

var nameLabel = new Label { ... };
nameLabel.SetBinding(Label.TextProperty, "SelectedMonkey.Name");

var locationLabel = new Label { ... };
locationLabel.SetBinding(Label.TextProperty, "SelectedMonkey.Location");

var image = new Image { ... };
image.SetBinding(Image.SourceProperty, "SelectedMonkey.ImageUrl");

var detailsLabel = new Label();
detailsLabel.SetBinding(Label.TextProperty, "SelectedMonkey.Details");

Los datos de propiedad SelectedItem se enlazan a la propiedad SelectedMonkey del modelo de vista conectado, que es de tipo Monkey. Por lo tanto, cuando el usuario selecciona un elemento en Picker, la propiedad SelectedMonkey se establecerá en el objeto Monkey seleccionado. Los datos del objeto SelectedMonkey se muestran en la interfaz de usuario mediante las vistas Label y Image:

Selección de elementos de selector

Nota:

Tenga en cuenta que las propiedades SelectedItem y SelectedIndex admiten enlaces bidireccionales de forma predeterminada.