2017-11-20 16 views
0

Ich versuche, das verzögerte Laden von Elementen in einem ListView zu implementieren. aber LoadMoreItemsAsync wird nie aufgerufen.LoadMoreItemsAsync wird nicht aufgerufen

XAML:

<Grid> 
    <ListView Grid.Row="1" x:Name="MasterListView" ItemsSource="{x:Bind ViewModel.News}"> 
     <!-- 
      <ListView.ItemTemplate> 
     --> 
    </ListView> 
</Grid> 

Ansichtsmodell:

public class HomeViewModel 
{ 
    public HomeViewModel() 
    { 
     News = new PaginateCollection<NormalNews>(LoadNews); 
    } 

    public PaginateCollection<NormalNews> News { get; set; } 

    public async Task<IEnumerable<NormalNews>> LoadNews(uint size) 
    { 
     // ... 
    } 
} 

PaginateCollection:

public class PaginateCollection<T> : ObservableCollection<T>, ISupportIncrementalLoading 
{ 
    Func<uint, Task<IEnumerable<T>>> load; 
    public PaginateCollection(Func<uint, Task<IEnumerable<T>>> load) 
    { 
     this.load = load; 
    } 

    public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) 
    { 
     return AsyncInfo.Run(async c => 
     { 
      var data = await load(count); 
      foreach (var item in data) 
      { 
       Add(item); 
      } 
      return new LoadMoreItemsResult 
      { 
       Count = (uint)data.Count() 
      }; 
     }); 
    } 

    public bool HasMoreItems { get; set; } 
} 
+1

Nicht sicher, aber sollten Sie HasMoreItems nicht auch auf True setzen müssen? Sehen Sie das nicht in Ihrem Code ... cfr das Beispiel von Microsoft gegeben https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.data.isupportincrementalloading – Depechie

+0

Ich setze das HasMoreItems in der Methode 'LoadNews()', aber es heißt nicht, – HeroWong

+2

Selbes Problem, im Konstruktor der PaginateCollection die Eigenschaft HasMoreItems auf true setzen. Dies stellt den ersten Lasttrigger sicher. Oder mit den neuen C# Konventionen bool HasMoreItems {get; einstellen; } = wahr; – Depechie

Antwort

0

Im Konstruktor des PaginateCollection stellen Sie die HasMoreItems Eigenschaft auf true. Dies stellt den ersten Lasttrigger sicher. So wird die Methode LoadNews() aufgerufen und Ihre Logik wird ausgeführt.

public PaginateCollection(Func<uint, Task<IEnumerable<T>>> load) 
{ 
    this.load = load; 
    HasMoreItems = true; 
}