2
respostas

Duvida sobre grid

Eu tenho uma lista, com de pessoa com Nome e Id, e gostaria de varrer essa lista através de Bindings em código XAML, e gerar um botão no grid (evento) para cada objeto da minha lista.

2 respostas

Oi Gabriel, tudo bem?

Você pode dar uma olhada na solução encontrada pelo usuário Auri no final deste post no fórum do Xamarin:

https://forums.xamarin.com/discussion/21913/button-inside-listview

<ListView x:Name="LocationsListView" 
                    ItemsSource="{Binding Items}"
                    VerticalOptions="FillAndExpand"
                     HasUnevenRows="true"
                     RefreshCommand="{Binding LoadLocationsCommand}"
                     IsPullToRefreshEnabled="true"
                     IsRefreshing="{Binding IsBusy, Mode=OneWay}"
                     Refreshing="LocationsListView_OnRefreshing"
                     CachingStrategy="RecycleElement">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <StackLayout Orientation="Horizontal" Padding="5">
                                    <StackLayout WidthRequest="64">
                                        <Button 
                                            CommandParameter="{Binding Id}" 
                                            BackgroundColor="#4CAF50"
                                            Clicked="MapButtonClicked"
                                            Text="Map" 
                                            HorizontalOptions="FillAndExpand"></Button>
                                        <Button 
                                            CommandParameter="{Binding Id}" 
                                            BackgroundColor="#4CAF50"
                                            Clicked="CallButtonClicked"
                                            Text="Call" 
                                            HorizontalOptions="FillAndExpand"></Button>
                                    </StackLayout>
                                </StackLayout>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
                    protected void MapButtonClicked(object sender, EventArgs e)
                    {
                        var selectedLocation = _viewModel.Items.First(item =>
                            item.Id == int.Parse((sender as Button).CommandParameter.ToString()));

                        Utility.LaunchMapApp(selectedLocation.Latitude, selectedLocation.Longitude);
                    }

Basicamente, ele usou ListView , onde cada ViewCell possui dois botões. Provavelmente você vai ter que customizar um bocado, mas talvez a ideia seja a mesma que a sua.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:ApptaFoodMobile"
             x:Class="ApptaFoodMobile.MesaComandaView">
    <ContentPage.Content>
        <ScrollView>
            <StackLayout>
            <Grid x:Name="controlGrid" RowSpacing="1" ColumnSpacing="1">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
            </Grid>
        </StackLayout>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>
 private void CarregarGrid(int quantidadeColunas)
        {
            int linha = 0;
            int item = 0;
            for (int i = 0; i < ViewModel.Lista.Count; i++)
            {
                for (int j = 0; j <= quantidadeColunas - 1; j++)
                {
                    if (item < ViewModel.Lista.Count)
                    {
                        controlGrid.Children.Add(new Button
                        {
                            Text = ViewModel.Lista[item].Matricula,
                            TextColor = Color.White,
                            BackgroundColor = Color.Default,
                            HorizontalOptions = LayoutOptions.Center,

                        }, j, linha);
                        item++;
                    }
                }
                linha++;
            }
            // Accomodate iPhone status bar.
            this.Padding = new Thickness(3, Device.OnPlatform(5, 0, 0), 3, 3);
            // Build the page.
            this.Content = controlGrid;
        }

Eu fiz dessa forma, foi o jeito que eu consegui, porem gostaria de deixar no padrão MVVM, Como eu faria? o método carregarGrid pega a Lista alimentada pelo BD, porem o grid ("x:controlGrid") é utilizado na view. Como eu devo fazer para deixar no padrao MVVM?