personalizado llenar item ejemplo context agrupar actions xamarin.forms xamarin.forms.listview

xamarin.forms - llenar - Cómo expandir y contraer ListView en formularios Xamarin



xamarin forms listview binding (2)

En ListView para mostrar los datos solo toma un GridLayout en ViewCell. Tome dos filas con altura automática en GridLayout. En la primera fila, muestre el encabezado y el botón, y en la segunda fila simplemente agregue los datos relacionados con el elemento y enlace una propiedad isvisible a esa segunda fila. Al hacer clic en esa flecha hacia arriba simplemente invertir el valor de la propiedad isvisible.

Es decir, si la propiedad de isvisible es verdadera, mostrará la fila 2 y, si la propiedad isvisible es falsa, solo le mostrará ese encabezado.

<ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="40"/> </Grid.ColumnDefinitions> <Label Text="{Binding HeaderText}" Grid.Row="0" Grid.Column="0" /> <Button Text="Show" Grid.Row="0" Grid.Column="1" Clicked="LableVisibleButton"/> <Label Grid.Row="1" Grid.Grid.ColumnSpan="2" FormattedText="{Binding FormattedText}" IsVisible=" {Binding LabelVisible}"/> </ViewCell>

Soy nuevo en Xamarin Forms y entiendo que hay muchos controles útiles. Estoy buscando un control que pueda expandirse para mostrar datos en una cuadrícula como en el ejemplo a continuación.

Actualizar

Modelo:

public class Phone { public string mobile { get; set; } public string home { get; set; } public string office { get; set; } } public class Contact { public string id { get; set; } public string name { get; set; } public string email { get; set; } public string address { get; set; } public string gender { get; set; } public Phone phone { get; set; } } public class ContactList { public List<Contact> contacts { get; set; } }

XAML:

<Grid> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Label Grid.Row="0" Margin="10" Text="Display Json Data" FontSize="25" /> <ListView x:Name="listviewConacts" Grid.Row="1" HorizontalOptions="FillAndExpand" HasUnevenRows="True" ItemSelected="listviewContacts_ItemSelected"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid HorizontalOptions="FillAndExpand" Padding="10"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Label Text="{Binding name}" HorizontalOptions="StartAndExpand" Grid.Row="0" TextColor="Blue" FontAttributes="Bold"/> <Label Text="{Binding email}" HorizontalOptions="StartAndExpand" Grid.Row="1" TextColor="Orange" FontAttributes="Bold"/> <Label Text="{Binding phone.mobile}" HorizontalOptions="StartAndExpand" Grid.Row="2" TextColor="Gray" FontAttributes="Bold"/> <BoxView HeightRequest="2" Margin="0,10,10,0" BackgroundColor="Gray" Grid.Row="3" HorizontalOptions="FillAndExpand" /> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid> <ActivityIndicator x:Name="ProgressLoader" IsRunning="True"/> </Grid>

Basado en el modelo y XAML anterior, ¿cómo puedo lograr un ListView expandible y plegable como el de la imagen de arriba?


Lo hice en el bloc de notas, así que no lo he probado. Además, generalmente no hago xaml. Sin embargo, esto debería funcionar. Acabo de agregar 2 botones en la parte superior de su cuadrícula, vinculados al mismo comando que alterna un booleano para decir si su cuadrícula debe ser visible o no.

Su ViewModel:

namespace XamlSamples.Models { public class Phone { public string mobile { get; set; } public string home { get; set; } public string office { get; set; } } public class Contact { public string id { get; set; } public string name { get; set; } public string email { get; set; } public string address { get; set; } public string gender { get; set; } public Phone phone { get; set; } public bool IsCollapsed { get; private set; } public ICommand ToggleCollapseCommand { get; } public Contact() => ToggleCollapseCommand = new Command(_ => IsCollapsed = !IsCollapsed); } public class ContactList { public List<Contact> contacts { get; set; } } public class InvertBoolConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => !(bool)value; public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => !(bool)value; } }

Su punto de vista:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:models="clr-namespace:XamlSamples.Models;assembly=XamlSamples" x:Class="XamlSamples.CollapsableListView"> <ContentPage.Resources> <ResourceDictionary> <models:InvertBoolConverter x:Key="invertBoolConverter" /> </ResourceDictionary> </ContentPage.Resources> <Grid> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Label Grid.Row="0" Margin="10" Text="Display Json Data" FontSize="25" /> <ListView x:Name="listviewConacts" Grid.Row="1" HorizontalOptions="FillAndExpand" HasUnevenRows="True" ItemSelected="listviewContacts_ItemSelected"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <StackLayout Orientation="Vertical"> <Button Text="Tap to Uncollapse" Command="{Binding ToggleCollapseCommand}" IsVisible="{Binding IsCollapsed}"/> <Button Text="Tap to Collapse" Command="{Binding ToggleCollapseCommand}" IsVisible="{Binding IsCollapsed, Converter={StaticResource invertBoolConverter}}"/> <Grid HorizontalOptions="FillAndExpand" Padding="10" IsVisible="{Binding IsCollapsed, Converter={StaticResource invertBoolConverter}}"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Label Text="{Binding name}" HorizontalOptions="StartAndExpand" Grid.Row="0" TextColor="Blue" FontAttributes="Bold"/> <Label Text="{Binding email}" HorizontalOptions="StartAndExpand" Grid.Row="1" TextColor="Orange" FontAttributes="Bold"/> <Label Text="{Binding phone.mobile}" HorizontalOptions="StartAndExpand" Grid.Row="2" TextColor="Gray" FontAttributes="Bold"/> <BoxView HeightRequest="2" Margin="0,10,10,0" BackgroundColor="Gray" Grid.Row="3" HorizontalOptions="FillAndExpand" /> </Grid> </StackLayout> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid> <ActivityIndicator x:Name="ProgressLoader" IsRunning="True"/> </Grid>