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.
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.
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?