“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 != )
{
var listview = (ListView)d;
if (listview != null)
{
if (listview.Items.Count > )
{
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=""></ListView>
在VM中刷新数据后,需要手动更改值来触发:
//滚动到顶部
ScrollToIndex = ;
ScrollToIndex = ;
我觉得这种实现方式比较丑,如果大家有好的实现方式欢迎留言讨论。
“Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置的更多相关文章
- “Win10 UAP 开发系列”之主题模式切换
微软动作真是快,本来想写WP8.1RT系列,结果刚整理了一点就出Win10 UAP了.不过还好RT到Win10的差别还不算太大.前两天参加了Win10开发极客秀,虽然没获奖,不过在韦恩卑鄙的帮助下顺利 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- 在MVVM模式中,按钮Click事件的绑定方法
在MVVM模式中,我们将Button的方法写到ViewModel中,然后绑定到前端界面.通常的做法是写一个类,继承ICommand接口,然而如果按钮比较多的话,就需要写很多的类,对于后期维护造成很大的 ...
- silverlighter下MVVM模式中利用Behavior和TargetedTriggerAction实现文本框的一些特效
在silverlight一般开发模式中,给文本框添加一些事件是轻而易举的,然而MVVM开发模式中,想要给文本框添加一些事件并非那么容易,因为MVVM模式中,只有ICommand接口,而且也只有Butt ...
- Messenger在MVVM模式中的应用
Messenger在MVVM模式中的应用 Messenger在MVVM中应用的前提 我们知道在MVVM架构中,系统平台的Silverlight客户端界面开发和业务逻辑已经被分开,XAML是SL的主要部 ...
- WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制
原文:WPF MVVM模式中,通过命令实现窗体拖动.跳转以及显隐控制 在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护.但是,很多初学者会在使用MVVM的过程中遇到 ...
- Windows下USB磁盘开发系列二:枚举系统中所有USB设备
上篇 <Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>介绍了很简单的获取系统U盘盘符的办法,现在介绍下如何枚举系统中所有USB设备(不光是U盘). 主要调用的API如下: 1 ...
- Windows下USB磁盘开发系列三:枚举系统中U盘、并获取其设备信息
前面我们介绍了枚举系统中的U盘盘符(见<Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>).以及获取USB设备的信息(见<Windows下USB磁盘开发系列二:枚举系统中 ...
- WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...
随机推荐
- 一个App完成入门篇(一)-从Hello world开始
程序员学习新技术都是通过Hello World开始的,我们也不例外.第一课我们简单了解利用do平台开发App的基本流程,能了解到的知识点是: 开发环境搭建 创建开发者账号 新建项目 拖拽一个组件 修改 ...
- Android SDK content Loader has encountered a problem.parseSdkContent failed
打开Eclipse,弹出Android SDK content Loader has encountered a problem.parseSdkContent failed,当点击detail按钮, ...
- 翻译-DevOps究竟是什么?
原文地址:http://www.drdobbs.com/architecture-and-design/what-exactly-is-devops/240009147 作者:Neil Garnich ...
- 虚拟化平台cloudstack(3)——安装(下)
登录时用户名和密码错误 默认账号密码 admin/password 管理节点安装好后,初始化数据库,完了使用admin和password登陆提示用户名密码错误,查看日志: Fail to genera ...
- 小计C/C++问题(1)
本文主要记录了以下2个问题: 表达式中,有符号变量和无符号变量的转化问题 C/C++中,main函数执行完以后,还执行了什么语句? 这里简单的说一下我的环境:Win7 32位,Qt creator 5 ...
- 数据库的Timeout
数据库的Timeout 其实有很多种情况. 一个是执行的超时时间 executionTimeOut,一个是连接的超时时间connectionTimeOut, 还有呢? 等待的超时时间 ReadTime ...
- iOS-----用LLDB调试,让移动开发更简单(二)
image lookup –address 当我们有一个地址,想查找这个地址具体对应的文件位置,可以使用image lookup --address,简写为image lookup -a e.g: 当 ...
- 每天一个linux命令(32):gzip命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用 ...
- Excel学习笔记
---恢复内容开始--- -----------随学随记----------- 获取当前日期: 获取当前系统时间,包含年月日时分秒: =NOW() 获取当前系统时间,包含年月日: =TODAY() 只 ...
- 下列哪项不属于jdk1.6垃圾收集器?
下列哪项不属于jdk1.6垃圾收集器? A. Serail 收集器 B. parNew 收集器 C. CMS 收集器 D. G1 收集器 答案:D 解:Java垃圾收集器发展路径下图所示: 其 ...