<Window x:Class="WpfApplication5.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" mc:Ignorable="d" Title="MainWindow" Height="800" Width="1000"> <Grid> <telerik:RadGridView x:Name="IssueGrid" Grid.Row="0" Height="150" ItemsSource="{Binding CollectionView}" ShowSearchPanel="True" ShowGroupPanel="False" GroupRenderMode="Flat" RowDetailsVisibilityMode="VisibleWhenSelected" RowIndicatorVisibility="Collapsed" IsReadOnly="True" IsFilteringAllowed="False" AutoGenerateColumns="False" CanUserFreezeColumns="False" Margin="5,0"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn Header="重要程度" Width="200" DataMemberBinding="{Binding Id}"/> <telerik:GridViewDataColumn Header="重要程度" Width="200" DataMemberBinding="{Binding Name}"/> <telerik:GridViewDataColumn Header="重要程度" Width="200" DataMemberBinding="{Binding Age}"/> <telerik:GridViewDataColumn Header="重要程度" Width="200" DataMemberBinding="{Binding Grade}"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </Grid> </Window>
后台代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading.Tasks; using Telerik.Windows.Data; using WpfApplication5.Annotations; namespace WpfApplication5 { public enum RequestStatus { None = 0, Requesting, Success, Failure } public class ViewModel:INotifyPropertyChanged { public VirtualQueryableCollectionView CollectionView { get; } protected Dictionary<int, RequestStatus> RequestMap { get; } public List<TestData> Datas=new List<TestData>(); public List<TestData> ServicesDatas { get; set; } public bool IsBusy { get; set; } public ViewModel() { CollectionView=new VirtualQueryableCollectionView(Datas,typeof(TestData)); CollectionView.LoadSize = 2;//加载页数 CollectionView.ItemsLoading += OnItemsLoading; CollectionView.VirtualItemCount = 14;//总页数 RequestMap = new Dictionary<int, RequestStatus>(); } //根据条件取得数据 调用后台 private async void OnItemsLoading(object sender, VirtualQueryableCollectionViewItemsLoadingEventArgs e) { var pageNo = (int)Math.Ceiling(1.0 * e.StartIndex / 2) + 1;//2是加载页数 try { IsBusy = true; RequestStatus status; if (!RequestMap.TryGetValue(pageNo, out status) || status == RequestStatus.Failure) { RequestMap[pageNo] = RequestStatus.Requesting; ServicesDatas= await Task.Run((() => new List<TestData>() { new TestData() {Id = "1", Name = "2", Age = "3", Grade = "4"}, new TestData() {Id = "1", Name = "2", Age = "3", Grade = "4"}, })); if (ServicesDatas == null) return; RequestMap[pageNo] = RequestStatus.Success; Datas.AddRange(ServicesDatas); CollectionView.Refresh(); } } catch (Exception ex) { RequestMap[pageNo] = RequestStatus.Failure; Debug.WriteLine($"fail to fetch issues {ex}"); } finally { IsBusy = false; } } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class TestData { public string Id { get; set; } public string Name { get; set; } public string Age { get; set; } public string Grade { get; set; } } }
listbox 也适用
<ListBox ItemsSource="{Binding CollectionView}" Height="150"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Margin="3"> <DockPanel > <TextBlock Text="{Binding Id}" /> <TextBlock Text=", " /> <TextBlock Text="{Binding Name}" /> <TextBlock Text=", " /> <TextBlock Text="{Binding Age}" /> </DockPanel> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>