“Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

原文:“Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题。比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一个ScrollIntoView()方法可以控制滚动的位置,但最好在VM中不要出现直接控制View的代码,需要通过其他的方式。

使用一个扩展属性即可实现:

/// <summary>
    /// 将ListView滚动到顶部 使用方法:在ListView增加扩展属性
    /// ext:ListViewScrollToProperties.ScrollToIndex="{Binding ScrollToIndex}"
    /// 在VM中先vm.ScrollToIndex = 1;再vm.ScrollToIndex = 0;
    /// </summary>
    public class ListViewScrollToProperties : DependencyObject
    {
        public static readonly DependencyProperty ScrollToIndexProperty =
            DependencyProperty.RegisterAttached("ScrollToIndex", typeof(int), typeof(ListViewScrollToProperties), new PropertyMetadata("", OnScrollToIndexChanged));

        public static string GetScrollToIndex(DependencyObject dependencyObject)
        {
            return (string)dependencyObject.GetValue(ScrollToIndexProperty);
        }

        public static void SetScrollToIndex(DependencyObject dependencyObject, string scrollToIndex)
        {
            dependencyObject.SetValue(ScrollToIndexProperty, scrollToIndex);
        }

        private static void OnScrollToIndexChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if ((int)e.NewValue != 1)
            {
                var listview = (ListView)d;
                if (listview != null)
                {
                    if (listview.Items.Count > 0)
                    {
                        try
                        {
                            var target = listview.Items[int.Parse(e.NewValue.ToString())];
                            if (target != null)
                            {
                                listview.UpdateLayout();
                                listview.ScrollIntoView(target);
                            }
                        }
                        catch (Exception ex)
                        {
                            System.Diagnostics.Debug.WriteLine(ex.Message);
                        }
                    }
                }
            }
        }
    }

使用方式比较丑,可以将就用:

在VM中提供一个ScrollToIndex属性,绑定到ListView上:

<ListView ItemsSource="{Binding ArticleItemList}"
                              controlHelper:ListViewScrollToProperties.ScrollToIndex="{Binding ScrollToIndex}"
                              Margin="0"></ListView>

在VM中刷新数据后,需要手动更改值来触发:

//滚动到顶部
ScrollToIndex = 1;
ScrollToIndex = 0;

我觉得这种实现方式比较丑,如果大家有好的实现方式欢迎留言讨论。

 

时间: 2025-01-20 13:18:06

“Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置的相关文章

“Win10 UAP 开发系列”之主题模式切换

原文:"Win10 UAP 开发系列"之主题模式切换 微软动作真是快,本来想写WP8.1RT系列,结果刚整理了一点就出Win10 UAP了.不过还好RT到Win10的差别还不算太大.前两天参加了Win10开发极客秀,虽然没获奖,不过在韦恩卑鄙的帮助下顺利将澎湃新闻WP8.1版升级到了Win10UAP,使用了一些新的特性,最近争取有时间慢慢把一些东西总结一下. 今天先说一下如何在Win10 UAP中切换主题模式. 切换日间.夜间主题模式这个功能我从WP8就实现了,并封装成了一个库,用在我

Win10 UWP开发系列:开发一个自定义控件——带数字徽章的AppBarButton

原文:Win10 UWP开发系列:开发一个自定义控件--带数字徽章的AppBarButton 最近有个项目有一个这样的需求,在文章浏览页底部有几个AppBarButton,其中有一个是评论按钮,需要在评论按钮上显示一个红色数字,类似微信的新消息提醒: 这种设计在iOS和Android平台都是很常见的,但UWP上并没有提供现成的控件.所以只能自己实现一个了.   做出来效果是这样的:   分析一下实现的思路.首先这还是一个AppBarButton,只是其中增加了一个数字徽章的显示,这个属性应该是可

Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航

原文:Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航 在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便.全景视图因为对设计要求比较高,自己总是做不出好的效果.对于一般的新闻阅读类App来说,Pivot更适合多个频道的展示,因为内容基本都是一样的. 到了Win10,微软模仿其他平台也推出了汉堡菜单,但并没有提供现成的控件,而是需要开发者通过一个名为SplitView的控件来实现.我个人并不觉得左上

Win10 UWP开发系列:实现Master/Detail布局

原文:Win10 UWP开发系列:实现Master/Detail布局 在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn997765.aspx 样式如下: 在微软官方的Sample里,有这种样式的代码示例,下载地址:https:

Win10 UWP 开发系列:使用多语言工具包让应用支持多语言

原文:Win10 UWP 开发系列:使用多语言工具包让应用支持多语言 之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工具包的使用,但因社区改版那篇文章已经找不到了. 当时写的时候还没有出Win10的SDK,都是基于UAP框架写的.微软早已经发布了Win10的SDK,相应的项目结构也发生了变化,以前分为两个项目通过Share项目共享代码的方式被抛弃

Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题

原文:Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题 最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面.经查,有问题的都是Win10 10586版本.   我上篇博客中写到的自定义的AppBar控件,也存在这个问题,10586会报错.   为此特意下载了10586的SDK调试.错误显示,一个样式找不到,名为ListViewItemBackground.因为开发的时

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

原文:Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App 安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneGap.ionic.AngularJS这些框架或库的关系,我个人理解是这样,PhoneGap是一个商业项目,用来实现HTML5式的跨平台开发,后来Adobe公司将其中的核心代码开源,就是Co

Win10 UWP 开发系列:使用SQLite

原文:Win10 UWP 开发系列:使用SQLite 在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中,可以使用SQLite.本篇文章说一下如何在UWP中使用SQLite.因为SQLite是跨平台的,版本众多,我刚开始用的时候不知道要装哪个,什么WP8的.WP8.1的.Win RT的--简直摸不着头脑.希望这篇文章能让大家少走点弯路. 其实这篇文

Win10 UWP开发系列——开源控件库:UWPCommunityToolkit

原文:Win10 UWP开发系列--开源控件库:UWPCommunityToolkit 在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库-- UWPCommunityToolkit 项目代码托管在Github上:https://github.com/Microsoft/UWPCommunityToolkit 包括以下几个类库: 都可以很方便的从Nuget上安装. NuGet Package Name des