2012-05-10 18 views
5

Tôi đang cố gắng tạo một ứng dụng tham chiếu Win8 Metro cho các danh sách được ảo hóa. Khi thực hiện một số đọc (rất thưa thớt), tôi đã nhận thấy rằng cách khuyến khích hỗ trợ này là thông qua giao diện ISupportIncrementalLoading.ISupportIncrementalLoading only fire after once

Tôi gặp sự cố với ứng dụng tham chiếu, trong đó phương thức LoadMoreItemsAsync được gọi một lần, nhưng không được gọi lại, mặc dù thuộc tính HasmoreItems của chúng tôi được mã hóa cứng để trả về True.

Mã dưới đây nên làm là tải 40 mục, sau đó tải số 'x' vào một thời điểm sau đó. Điều gì xảy ra là nó tải 40 mục đầu tiên, sau đó được nhắc tải 42 hơn, sau đó không bao giờ được yêu cầu tải lại.

Đây là phần có liên quan của mã của tôi:

XAML

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}"> 
    <ListView ItemsSource="{Binding Items}" Width="800" HorizontalAlignment="Left" Margin="12"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Title}" Foreground="White"/> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

</Grid> 

ViewModel và Hỗ trợ Lớp học:

public class MainViewModel : ViewModelBase 
{ 

    public MyIncrementalCollection Items { get; set; } 

    public MainViewModel() 
    { 

     Items = new MyIncrementalCollection(); 



     for (int i = 0; i < 40; i++) 
     { 
      Items.Add(new MyData {Title = string.Format("Item: {0}", i)}); 
     } 
    } 
} 

public class MyData 
{ 
    public string Title { get; set; } 
} 

public class MyIncrementalCollection : ObservableCollection<MyData>, ISupportIncrementalLoading 
{ 
    public bool HasMoreItems 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) 
    { 
     return 
      (IAsyncOperation<LoadMoreItemsResult>) 
      AsyncInfo.Run((System.Threading.CancellationToken ct) => LoadDataAsync(count)); 
    } 

    private async Task<LoadMoreItemsResult> LoadDataAsync(uint count) 
    { 

     for (int i = 0; i < count; i++) 
     { 
      this.Add(new MyData { Title = string.Format("Item: {0}, {1}", i, System.DateTime.Now) }); 
     } 

     var ret = new LoadMoreItemsResult {Count = count}; 

     return ret; 
    } 


} 

}

Trả lời

2

Vấn đề là phương pháp của bạn LoadDataAsync (count uint) thiếu các nhà điều hành đang chờ đợi và do đó nó sẽ chạy đồng bộ. Tôi gặp sự cố tương tự. Ảo hóa dữ liệu đang hoạt động cho tôi trong khi tôi nhận được một số thư mục thư viện nhưng nó chỉ được kích hoạt một lần khi tôi cố tải một tập hợp các mục tùy chỉnh.

Tôi đã sử dụng giải pháp thay thế, không phải rất thanh lịch nhưng nó hoạt động. Sửa LoadDataAsync bạn phương pháp như thế này:

private async Task<LoadMoreItemsResult> LoadDataAsync(uint count) 
{ 
    Task task = Task.Delay(1); 
    await task; 

    for (int i = 0; i < count; i++) 
    { 
    Add(new MyData { Title = string.Format("Item: {0}, {1}", i, System.DateTime.Now) }); 
    } 

    return new LoadMoreItemsResult {Count = count}; 
} 
+0

Vâng, shucks. Điều đó hoạt động. Tôi tự hỏi nếu họ sẽ sửa lỗi này trong RC ... – Robaticus

0

Giao diện sẽ chỉ gọi HasMoreItems khi nó cảm thấy nó cần. Nếu nó có đủ các mục để điền vào khu vực hiện tại có thể xem được thì nó sẽ không kiểm tra thêm các mục. Nếu bạn bắt đầu cuộn về phía cuối danh sách thì nó sẽ kiểm tra xem có nhiều mục hơn không (và nếu có cuộc gọi LoadMoreItemsAsync).

Là một sang một bên, bạn có thể đơn giản hóa mã của bạn trong LoadMoreItemsAsync để

public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) 
{ 
    return LoadDataAsync(count).AsAsyncOperation(); 
} 
+0

Cảm ơn đã đơn giản hóa. Vấn đề ở đây là, khi tôi cuộn, tải chỉ được gọi một lần. Tôi có thể làm cho nó tất cả các cách để dưới cùng của danh sách, sau khi tải đầu tiên của các hạng mục bổ sung, và nó không bao giờ cháy một lần nữa. – Robaticus

+0

Ok, toàn bộ chế độ xem của bạn có phải là xaml không? Các vấn đề khác có thể bao gồm nếu bạn có ListView của bạn bên trong một ScrollViewer bạn sẽ không nhận được kích hoạt ảo hóa dữ liệu (vì nó phụ thuộc vào việc sử dụng ScrollViewer của Chế độ xem danh sách). –

+0

Đó là toàn bộ, ngoại trừ thẻ '' kèm theo. Tôi có phải làm bất cứ điều gì cụ thể trong hành động tải không đồng bộ của mình để nói cho ListView rằng tôi đã tải xong, vì vậy nó không kích hoạt lại không? Tôi cho rằng sự trở lại của LoadMoreItemsResult sẽ là tất cả những gì nó thực sự cần thiết. – Robaticus