博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF MVVM模式下实现ListView下拉显示更多内容
阅读量:5061 次
发布时间:2019-06-12

本文共 5264 字,大约阅读时间需要 17 分钟。

原文:

在手机App中,如果有一个展示信息的列表,通常会展示很少一部分,当用户滑动到列表底部时,再加载更多内容。这样有两个好处,提高程序性能,减少网络流量。这篇博客中,将介绍如何在WPF ListView中实现这个功能。

实现思路:为ListView新增一个附加属性,用来绑定当下拉到底部时触发增加列表内容的功能。

XAML:

ScrollViewerMonitor:

public class ScrollViewerMonitor    {        public static ICommand GetAtEndCommand(DependencyObject obj)        {            return (ICommand)obj.GetValue(AtEndCommandProperty);        }        public static void SetAtEndCommand(DependencyObject obj, ICommand value)        {            obj.SetValue(AtEndCommandProperty, value);        }        public static readonly DependencyProperty AtEndCommandProperty =            DependencyProperty.RegisterAttached("AtEndCommand", typeof(ICommand),                 typeof(ScrollViewerMonitor), new PropertyMetadata(OnAtEndCommandChanged));        public static void OnAtEndCommandChanged(            DependencyObject d, DependencyPropertyChangedEventArgs e)        {            FrameworkElement element = (FrameworkElement)d;            if (element != null)            {                element.Loaded -= element_Loaded;                element.Loaded += element_Loaded;            }        }        private static void element_Loaded(object sender, RoutedEventArgs e)        {            FrameworkElement element = (FrameworkElement)sender;            element.Loaded -= element_Loaded;            ScrollViewer scrollViewer = FindChildOfType
(element); if(scrollViewer == null) { throw new InvalidOperationException("ScrollViewer not found."); } scrollViewer.ScrollChanged += delegate { bool atBottom = scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight; if(atBottom) { var atEnd = GetAtEndCommand(element); if(atEnd != null) { atEnd.Execute(null); } } }; } private static T FindChildOfType
(DependencyObject root) where T : class { var queue = new Queue
(); queue.Enqueue(root); while (queue.Count > 0) { DependencyObject current = queue.Dequeue(); for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--) { var child = VisualTreeHelper.GetChild(current, i); var typedChild = child as T; if (typedChild != null) { return typedChild; } queue.Enqueue(child); } } return null; } }

MainViewModel:

public class MainViewModel : INotifyPropertyChanged    {        public MainViewModel()        {            _busy = false;            AddMoreItems();            fetchMoreDataCommand = new DelegateCommand(() => {                ThreadPool.QueueUserWorkItem(                    delegate                    {                        Busy = true;                        Thread.Sleep(3000);                        App.Current.Dispatcher.BeginInvoke(new Action(()=> {                            AddMoreItems();                            Busy = false;                        }));                    });            });        }        private void AddMoreItems()        {            int start = items.Count;            int end = start + 10;            for (int i = start; i < end; i++)            {                items.Add("Item " + i);            }        }        readonly DelegateCommand fetchMoreDataCommand;        public ICommand FetchMoreDataCommand        {            get            {                return fetchMoreDataCommand;            }        }        private ObservableCollection
items = new ObservableCollection
(); public ObservableCollection
Items { get { return items; } } private bool _busy; public bool Busy { get { return _busy; } set { if(_busy != value) { _busy = value; OnPropertyChanged("Busy"); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if(PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }

Busy属性用来决定是否显示Loading。

运行效果:

感谢您的阅读!代码点击下载。

posted on
2018-11-12 14:35 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/9946317.html

你可能感兴趣的文章
mvc5 @RenderSection("scripts", required: false) 什么意思
查看>>
查看dump oracle数据块查看
查看>>
Jmeter 指令记录
查看>>
使用mstest.exe 命令行跑test case(不安装Visual Studio 2010)
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_10_练习:统计输入的字符串中...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_4_Iterator接口介绍...
查看>>
seureCRT快捷键
查看>>
大道至简第一章读后感
查看>>
在MFC中使用ShockwaveFlash插件播放swf文件(VS2008-VC++MFC)
查看>>
Notepad++打开as文件时使用as3的语法高亮
查看>>
font
查看>>
POJ - 2456 Aggressive cows
查看>>
LeetCode OJ 147. Insertion Sort List
查看>>
JavaScript奇技淫巧44招
查看>>
【iCore2双核心板】SRAM 读写实验(基于Verilog语言)
查看>>
企业该如何才能加强与客户之间的关系
查看>>
文成小盆友python-num4 装饰器,内置函数
查看>>
11.5 函数调用 以及 字符串的方法
查看>>
解决Sql Plus乱码的曲折历程
查看>>
CRM JS 日期格式化及时间设置
查看>>