2017-08-10 2 views
1

Ich entwickle eine Xamarin Forms App, es hat eine Registerkarte. Eine der Registerkarten enthält ein Steuerelement ListView, das Daten zeigt, die von einer Rest-API verbraucht wurden. Wenn ich auf die Schaltfläche "Hinzufügen" tippe, wird ein Modal angezeigt, in dem ich neue Objekte erstellen und Beiträge an die Rest-API senden kann. Nach dem Erfolg knalle ich das Modal aus der Navigation, was die ListView zeigt. In meinem ListView wird das letzte hinzugefügte Element nicht angezeigt.Xamarin - Refresh Listview nach Beitrag

Wie kann ich die Aktualisierung der ListView Aufruf der Rest-API, nachdem ich ein Element hinzufügen?

Hier ist meine XAML Seite: BonosView.xaml

<?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:iconize="clr-namespace:FormsPlugin.Iconize;assembly=FormsPlugin.Iconize" 
    x:Class="rodriguez.BonosView" x:Name="BonosView" 
    Title="Bonos"> 

    <ContentPage.Padding> 
     <OnPlatform x:TypeArguments="Thickness" iOS="0, 20, 0, 0" /> 
    </ContentPage.Padding> 

    <ContentPage.Content> 
     <StackLayout> 
      <Label x:Name="BonosListMessage" IsVisible="false" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Text="No exixten bonos para mostrar"/> 
      <ListView x:Name="BonosList" ItemTapped="ViewDetails" RowHeight="70" > 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <ViewCell> 
          <Grid> 
           <Grid.Padding> 
            <OnPlatform x:TypeArguments="Thickness" iOS="10,5" Android="10,5"/> 
           </Grid.Padding> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="*"/> 
            <RowDefinition Height="*"/> 
            <RowDefinition Height="*"/> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="*"/> 
           </Grid.ColumnDefinitions> 

           <Label x:Name="monto" Text="{Binding Monto}" Style="{DynamicResource TitleListBono}" Grid.Row="0" Grid.ColumnSpan="2" LineBreakMode="NoWrap" HorizontalOptions="StartAndExpand"/> 
           <Label x:Name="nombre" Text="{Binding nombreCompleto}" FontSize="Small" FontAttributes="Bold" Grid.Row="1" Grid.Column="0" HorizontalOptions="StartAndExpand"/> 
           <Label x:Name="estado" Text="{Binding Estado}" FontSize="Small" Grid.Row="1" Grid.Column="1" HorizontalOptions="End" TextColor="Green"/> 
           <Label x:Name="montoRD" Text="{Binding MontoRD}" FontSize="Small" Grid.Row="2" Grid.Column="0" HorizontalOptions="StartAndExpand"/> 
           <Label x:Name="fecha" Text="{Binding fechaCompra, StringFormat='{0:dd-MMM-yyyy}'}" FontSize="Small" Grid.Row="2" Grid.Column="1" HorizontalOptions="End"/> 
          </Grid> 
         </ViewCell> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
       </ListView> 

     </StackLayout> 
    </ContentPage.Content> 
</ContentPage> 

Und hier ist die Methode, die ich die Liste füllen rufen:

async void refreshData() 
{ 
    this.IsBusy = true; 
    bonosLista = await manager.GetAll(); //obtaining bonos from Server 

    if (bonosLista != null) 
    { 
     if (bonosLista.Count() > 0) 
     { 
      BonosList.ItemsSource = bonosLista; 
     } 
     else 
     { 
      BonosList.IsVisible = false; 
      BonosListMessage.IsVisible = true; 
     } 
    } 
    else 
    { 
     await DisplayAlert("Error!", "Se ha producido un error en la conexión", "OK"); 
    } 

    this.IsBusy = false; 
} 

ich diese Methode nach dem anrufen möchte modale Pops.

+0

Ich würde MessagingCenter verwenden, um eine Nachricht zu senden, nachdem der Beitrag abgeschlossen ist, die dann die LIstView zu aktualisieren seine Daten – Jason

+0

würde, wenn Sie für BonosList.ItemsSource in Ihrem Modell als ObservableCollectionBonosLista dann Liste sollte –

+0

aktualisieren sollte es tun, wenn ich zu drücken die Liste @YuriS –

Antwort

1

Mit Appearing Ereignis ist richtig, aber Sie müssen auch nicht async void auf ein Verfahren verwenden, es sei denn, es ein Event-Handler ist

aktualisieren refreshData Methode async Task

async Task refreshData() { 
    this.IsBusy = true; 
    bonosLista = await manager.GetAll(); //obtaining bonos from Server 

    if (bonosLista != null) { 
     if (bonosLista.Count() > 0) { 
      BonosList.ItemsSource = bonosLista; 
     } else { 
      BonosList.IsVisible = false; 
      BonosListMessage.IsVisible = true; 
     } 
    } else { 
     await DisplayAlert("Error!", "Se ha producido un error en la conexión", "OK"); 
    } 
    this.IsBusy = false; 
} 

Event-Handler zu verwenden sind die Nur Orte, an denen asynchrone Leerstellen verwendet werden können, aktualisieren Sie auf

this.Appearing += async (object sender, EventArgs e) => { 
    await refreshData(); 
}; 
1

Ich endete mit Appearing Methode auf der Seite, die die Listview, also wenn die modale Pops Ich kann innerhalb dieser Methode aktualisieren. Vielleicht ist es nicht die beste Lösung kaufen, es funktioniert gerade jetzt.

this.Appearing += (object sender, EventArgs e) => 
{ 
      refreshData(); 
};