wpf gridview 滚动懒加载

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

猜你喜欢

转载自www.cnblogs.com/dzh1990/p/8966050.html