Xamarin.Forms CarrosselVer dados
CarouselView
Inclui as seguintes propriedades que definem os dados a serem exibidos e sua aparência:
ItemsSource
, do tipoIEnumerable
, especifica a coleção de itens a serem exibidos e tem um valor padrão denull
.ItemTemplate
, do tipoDataTemplate
, especifica o modelo a ser aplicado a cada item na coleção de itens a serem exibidos.
Essas propriedades são apoiadas por objetos BindableProperty
, o que significa que as propriedades podem ser alvos de vinculações de dados.
Observação
CarouselView
define uma propriedade ItemsUpdatingScrollMode
que representa o comportamento de rolagem do CarouselView
quando novos itens são adicionados a ele. Para obter mais informações sobre essa propriedade, veja Controlar a posição de rolagem quando novos itens são adicionados.
CarouselView
oferece suporte à virtualização incremental de dados à medida que o usuário rola. Para obter mais informações, veja Carregar dados de forma incremental.
Preencher um CarouselView com dados
Um CarouselView
é preenchido com dados definindo sua propriedade ItemsSource
para qualquer coleção que implemente IEnumerable
. Por padrão, o CarouselView
exibe itens horizontalmente.
Importante
Se o CarouselView
for necessário para atualizar conforme os itens são adicionados, removidos ou alterados na coleção subjacente, a coleção subjacente deverá ser uma coleção IEnumerable
que envia notificações de alteração de propriedade, como ObservableCollection
.
CarouselView
pode ser preenchido com dados usando vinculação de dados para vincular sua propriedade ItemsSource
a uma coleção IEnumerable
. No XAML, isso é conseguido com a extensão de marcação Binding
:
<CarouselView ItemsSource="{Binding Monkeys}" />
Este é o código C# equivalente:
CarouselView carouselView = new CarouselView();
carouselView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
Nesse exemplo, os dados da propriedade ItemsSource
são vinculados à propriedade Monkeys
do viewmodel conectado.
Observação
As associações compiladas podem ser habilitadas para melhorar o desempenho da associação de dados em Xamarin.Forms aplicativos. Para obter mais informações, confira Associações compiladas do Xamarin.Forms.
Para obter informações sobre como alterar a CarouselView
orientação, consulte Xamarin.Forms Layout CarouselView. Para obter informações sobre como definir a aparência de cada item no CarouselView
, veja Definir aparência do item. Para obter mais informações sobre a associação de dados, consulte Xamarin.Forms Associação de dados.
Definir a aparência do item
A aparência de cada item no CarouselView
pode ser definida definindo a propriedade CarouselView.ItemTemplate
como um DataTemplate
:
<CarouselView ItemsSource="{Binding Monkeys}">
<CarouselView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Frame HasShadow="True"
BorderColor="DarkGray"
CornerRadius="5"
Margin="20"
HeightRequest="300"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand">
<StackLayout>
<Label Text="{Binding Name}"
FontAttributes="Bold"
FontSize="Large"
HorizontalOptions="Center"
VerticalOptions="Center" />
<Image Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="150"
WidthRequest="150"
HorizontalOptions="Center" />
<Label Text="{Binding Location}"
HorizontalOptions="Center" />
<Label Text="{Binding Details}"
FontAttributes="Italic"
HorizontalOptions="Center"
MaxLines="5"
LineBreakMode="TailTruncation" />
</StackLayout>
</Frame>
</StackLayout>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
Este é o código C# equivalente:
CarouselView carouselView = new CarouselView();
carouselView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
carouselView.ItemTemplate = new DataTemplate(() =>
{
Label nameLabel = new Label { ... };
nameLabel.SetBinding(Label.TextProperty, "Name");
Image image = new Image { ... };
image.SetBinding(Image.SourceProperty, "ImageUrl");
Label locationLabel = new Label { ... };
locationLabel.SetBinding(Label.TextProperty, "Location");
Label detailsLabel = new Label { ... };
detailsLabel.SetBinding(Label.TextProperty, "Details");
StackLayout stackLayout = new StackLayout
{
Children = { nameLabel, image, locationLabel, detailsLabel }
};
Frame frame = new Frame { ... };
StackLayout rootStackLayout = new StackLayout
{
Children = { frame }
};
return rootStackLayout;
});
Os elementos especificados no DataTemplate
definem a aparência de cada item no CarouselView
. No exemplo, o layout dentro do DataTemplate
é gerenciado por um StackLayout
, e os dados são exibidos com um objeto Image
e três objetos Label
, que se associam a propriedades da classe Monkey
:
public class Monkey
{
public string Name { get; set; }
public string Location { get; set; }
public string Details { get; set; }
public string ImageUrl { get; set; }
}
As capturas de tela a seguir mostram o resultado da modelagem de cada item:
Para obter mais informações sobre modelos de dados, consulte Xamarin.Forms Modelos de dados.
Escolher a aparência do item em tempo de execução
A aparência de cada item no CarouselView
pode ser escolhida em tempo de execução, com base no valor do item, definindo a propriedade CarouselView.ItemTemplate
como um objeto DataTemplateSelector
:
<ContentPage ...
xmlns:controls="clr-namespace:CarouselViewDemos.Controls"
x:Class="CarouselViewDemos.Views.HorizontalLayoutDataTemplateSelectorPage">
<ContentPage.Resources>
<DataTemplate x:Key="AmericanMonkeyTemplate">
...
</DataTemplate>
<DataTemplate x:Key="OtherMonkeyTemplate">
...
</DataTemplate>
<controls:MonkeyDataTemplateSelector x:Key="MonkeySelector"
AmericanMonkey="{StaticResource AmericanMonkeyTemplate}"
OtherMonkey="{StaticResource OtherMonkeyTemplate}" />
</ContentPage.Resources>
<CarouselView ItemsSource="{Binding Monkeys}"
ItemTemplate="{StaticResource MonkeySelector}" />
</ContentPage>
Este é o código C# equivalente:
CarouselView carouselView = new CarouselView
{
ItemTemplate = new MonkeyDataTemplateSelector { ... }
};
carouselView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
A propriedade ItemTemplate
é definida como um objeto MonkeyDataTemplateSelector
. O exemplo a seguir mostra a classe MonkeyDataTemplateSelector
:
public class MonkeyDataTemplateSelector : DataTemplateSelector
{
public DataTemplate AmericanMonkey { get; set; }
public DataTemplate OtherMonkey { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
return ((Monkey)item).Location.Contains("America") ? AmericanMonkey : OtherMonkey;
}
}
A classe MonkeyDataTemplateSelector
define as propriedades AmericanMonkey
e OtherMonkey
DataTemplate
que são definidas para modelos de dados diferentes. A substituição OnSelectTemplate
retorna o modelo AmericanMonkey
quando o nome do macaco contém "América". Quando o nome do macaco não contém "América", a substituição OnSelectTemplate
retorna o modelo OtherMonkey
, que exibe seus dados esmaecidos:
Para obter mais informações sobre seletores de modelo de dados, consulte Criar um Xamarin.Forms DataTemplateSelector.
Importante
Ao usar CarouselView
, nunca defina o elemento raiz dos seus objetos DataTemplate
como um ViewCell
. Isso resultará no lançamento de uma exceção porque CarouselView
não tem conceito de células.
exibir indicadores
Indicadores, que representam o número de itens e a posição atual em um CarouselView
, podem ser exibidos ao lado do CarouselView
. Isso pode ser feito com o controle IndicatorView
:
<StackLayout>
<CarouselView ItemsSource="{Binding Monkeys}"
IndicatorView="indicatorView">
<CarouselView.ItemTemplate>
<!-- DataTemplate that defines item appearance -->
</CarouselView.ItemTemplate>
</CarouselView>
<IndicatorView x:Name="indicatorView"
IndicatorColor="LightGray"
SelectedIndicatorColor="DarkGray"
HorizontalOptions="Center" />
</StackLayout>
Neste exemplo, o IndicatorView
valor é renderizado abaixo do CarouselView
, com um indicador para cada item no CarouselView
. O IndicatorView
é preenchido com dados definindo a propriedade CarouselView.IndicatorView
para o objeto IndicatorView
. Cada indicador é um círculo cinza-claro, enquanto o indicador que representa o item atual no CarouselView
é cinza-escuro:
Importante
Definir a propriedade CarouselView.IndicatorView
resulta na associação da propriedade IndicatorView.Position
à propriedade CarouselView.Position
e na associação da propriedade IndicatorView.ItemsSource
à propriedade CarouselView.ItemsSource
.
Para obter mais informações sobre indicadores, consulte Xamarin.Forms IndicatorView.
Menus de contexto
CarouselView
oferece suporte a menus de contexto para itens de dados por meio do SwipeView
, que revela o menu de contexto com um gesto de deslizar. O SwipeView
é um controle de contêiner que envolve um item de conteúdo e fornece itens de menu de contexto para esse item de conteúdo. Portanto, os menus de contexto são implementados para um CarouselView
criando um SwipeView
que define o conteúdo que o SwipeView
envolve e os itens do menu de contexto que são revelados pelo gesto de deslizar. Isso é feito adicionando um SwipeView
ao DataTemplate
que define a aparência de cada item de dados no CarouselView
:
<CarouselView x:Name="carouselView"
ItemsSource="{Binding Monkeys}">
<CarouselView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Frame HasShadow="True"
BorderColor="DarkGray"
CornerRadius="5"
Margin="20"
HeightRequest="300"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand">
<SwipeView>
<SwipeView.TopItems>
<SwipeItems>
<SwipeItem Text="Favorite"
IconImageSource="favorite.png"
BackgroundColor="LightGreen"
Command="{Binding Source={x:Reference carouselView}, Path=BindingContext.FavoriteCommand}"
CommandParameter="{Binding}" />
</SwipeItems>
</SwipeView.TopItems>
<SwipeView.BottomItems>
<SwipeItems>
<SwipeItem Text="Delete"
IconImageSource="delete.png"
BackgroundColor="LightPink"
Command="{Binding Source={x:Reference carouselView}, Path=BindingContext.DeleteCommand}"
CommandParameter="{Binding}" />
</SwipeItems>
</SwipeView.BottomItems>
<StackLayout>
<!-- Define item appearance -->
</StackLayout>
</SwipeView>
</Frame>
</StackLayout>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
Este é o código C# equivalente:
CarouselView carouselView = new CarouselView();
carouselView.SetBinding(ItemsView.ItemsSourceProperty, "Monkeys");
carouselView.ItemTemplate = new DataTemplate(() =>
{
StackLayout stackLayout = new StackLayout();
Frame frame = new Frame { ... };
SwipeView swipeView = new SwipeView();
SwipeItem favoriteSwipeItem = new SwipeItem
{
Text = "Favorite",
IconImageSource = "favorite.png",
BackgroundColor = Color.LightGreen
};
favoriteSwipeItem.SetBinding(MenuItem.CommandProperty, new Binding("BindingContext.FavoriteCommand", source: carouselView));
favoriteSwipeItem.SetBinding(MenuItem.CommandParameterProperty, ".");
SwipeItem deleteSwipeItem = new SwipeItem
{
Text = "Delete",
IconImageSource = "delete.png",
BackgroundColor = Color.LightPink
};
deleteSwipeItem.SetBinding(MenuItem.CommandProperty, new Binding("BindingContext.DeleteCommand", source: carouselView));
deleteSwipeItem.SetBinding(MenuItem.CommandParameterProperty, ".");
swipeView.TopItems = new SwipeItems { favoriteSwipeItem };
swipeView.BottomItems = new SwipeItems { deleteSwipeItem };
StackLayout swipeViewStackLayout = new StackLayout { ... };
swipeView.Content = swipeViewStackLayout;
frame.Content = swipeView;
stackLayout.Children.Add(frame);
return stackLayout;
});
Neste exemplo, o conteúdo SwipeView
é um StackLayout
que define a aparência de cada item que está cercado por um Frame
no CarouselView
. Os itens de passar o SwipeView
dedo são usados para executar ações no conteúdo e são revelados quando o controle é passado de cima para baixo:
SwipeView
suporta quatro direções de deslizamento diferentes, com a direção de deslizamento sendo definida pela coleção direcional SwipeItems
à qual os objetos SwipeItems
são adicionados. Por padrão, um item de deslizar é executado quando o usuário toca nele. Além disso, depois que um item de deslizar for executado, os itens de deslizar serão ocultados e o conteúdo SwipeView
será exibido novamente. No entanto, esses comportamentos podem ser alterados.
Para obter mais informações sobre o SwipeView
controle, consulte Xamarin.Forms SwipeView.
Deslizar para atualizar
CarouselView
dá suporte ao à funcionalidade de deslizar para atualizar por meio do RefreshView
, o que permite que os dados que estão sendo exibidos sejam atualizados puxando os itens para baixo. O RefreshView
é um controle de contêiner que fornece funcionalidade pull para atualizar para seu filho, desde que o filho suporte conteúdo rolável. Portanto, puxar para atualizar é implementado para um CarouselView
definindo-o como filho de um RefreshView
:
<RefreshView IsRefreshing="{Binding IsRefreshing}"
Command="{Binding RefreshCommand}">
<CarouselView ItemsSource="{Binding Animals}">
...
</CarouselView>
</RefreshView>
Este é o código C# equivalente:
RefreshView refreshView = new RefreshView();
ICommand refreshCommand = new Command(() =>
{
// IsRefreshing is true
// Refresh data here
refreshView.IsRefreshing = false;
});
refreshView.Command = refreshCommand;
CarouselView carouselView = new CarouselView();
carouselView.SetBinding(ItemsView.ItemsSourceProperty, "Animals");
refreshView.Content = carouselView;
// ...
Quando o usuário inicia uma atualização, o ICommand
definido pela propriedade Command
é executado, o que deve atualizar os itens que estão sendo exibidos. Uma visualização de atualização é mostrada enquanto a atualização ocorre, que consiste em um círculo de progresso animado:
O valor da propriedade RefreshView.IsRefreshing
indica o estado atual do RefreshView
. Quando uma atualização é acionada pelo usuário, essa propriedade fará a transição automaticamente para true
. Assim que a atualização for concluída, você deverá redefinir a propriedade para false
.
Para obter mais informações sobre RefreshView
o , consulte Xamarin.Forms RefreshView.
Carregar dados de forma incremental
CarouselView
oferece suporte à virtualização incremental de dados à medida que o usuário rola. Isso permite cenários como o carregamento assíncrono de uma página de dados de um serviço Web, à medida que o usuário rola. Além disso, o ponto em que mais dados são carregados é configurável para que os usuários não vejam espaços em branco ou sejam impedidos de rolar.
CarouselView
define as seguintes propriedades para controlar o carregamento incremental de dados:
RemainingItemsThreshold
, do tipoint
, o limite de itens ainda não visíveis na lista na qual o eventoRemainingItemsThresholdReached
será acionado.RemainingItemsThresholdReachedCommand
, do tipoICommand
, que é executado quando oRemainingItemsThreshold
é alcançado.RemainingItemsThresholdReachedCommandParameter
, do tipoobject
, que é o parâmetro passado paraRemainingItemsThresholdReachedCommand
.
CarouselView
também define um evento RemainingItemsThresholdReached
que é acionado quando o CarouselView
é rolado o suficiente para que RemainingItemsThreshold
os itens não sejam exibidos. Esse evento pode ser tratado para carregar mais itens. Além disso, quando o evento RemainingItemsThresholdReached
é disparado, o RemainingItemsThresholdReachedCommand
é executado, permitindo que o carregamento incremental de dados ocorra em um viewmodel.
O valor padrão da propriedade RemainingItemsThreshold
é -1, o que indica que o evento RemainingItemsThresholdReached
nunca será acionado. Quando o valor da propriedade for 0, o evento RemainingItemsThresholdReached
será acionado quando o item final do ItemsSource
for exibido. Para valores maiores que 0, o evento RemainingItemsThresholdReached
será disparado quando o ItemsSource
contiver aquele número de itens ainda não rolados.
Observação
CarouselView
valida a propriedade RemainingItemsThreshold
para que seu valor seja sempre maior ou igual a -1.
O exemplo XAML a seguir mostra um CarouselView
que carrega dados de forma incremental:
<CarouselView ItemsSource="{Binding Animals}"
RemainingItemsThreshold="2"
RemainingItemsThresholdReached="OnCarouselViewRemainingItemsThresholdReached"
RemainingItemsThresholdReachedCommand="{Binding LoadMoreDataCommand}">
...
</CarouselView>
Este é o código C# equivalente:
CarouselView carouselView = new CarouselView
{
RemainingItemsThreshold = 2
};
carouselView.RemainingItemsThresholdReached += OnCollectionViewRemainingItemsThresholdReached;
carouselView.SetBinding(ItemsView.ItemsSourceProperty, "Animals");
Nesse exemplo de código, o evento RemainingItemsThresholdReached
é acionado quando há dois itens ainda não rolados e, em resposta, executa o manipulador de eventos OnCollectionViewRemainingItemsThresholdReached
:
void OnCollectionViewRemainingItemsThresholdReached(object sender, EventArgs e)
{
// Retrieve more data here and add it to the CollectionView's ItemsSource collection.
}
Observação
Os dados também podem ser carregados de forma incremental vinculando o RemainingItemsThresholdReachedCommand
a uma implementação ICommand
no viewmodel.