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

简介: 原文:“Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题。比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一个ScrollIntoView()方法可以控制滚动的位置,但最好在VM中不要出现直接控制View的代码,需要通过其他的方式。
原文: “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;

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

 

目录
相关文章
|
3月前
Qt 控件大小随着窗口的大小而变化设置
Qt 控件大小随着窗口的大小而变化设置
60 0
|
4月前
[Qt5&布局] 控件自动填满所在布局框架
[Qt5&布局] 控件自动填满所在布局框架
36 0
[Qt5&布局] 控件自动填满所在布局框架
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
852 0
PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
|
前端开发 C#
使用MVVM DataTriggers在WPF XAML视图之间切换/Window窗口自适应内容大小并居中
原文 使用MVVM DataTriggers在WPF XAML视图之间切换 相关文章: http://www.technical-recipes.com/2016/switching-between-wpf-xaml-views-using-mvvm-datatemplate/ 这篇文章解决了能够根据ViewModel类的属性在不同视图之间切换的问题。
1788 0
|
前端开发 C# 数据格式
WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制
原文:WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制 在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护。但是,很多初学者会在使用MVVM的过程中遇到一个显而易见且无法回避的问题,那就是不同的窗体之间如何跳转?很多人在介绍MVVM的使用时,都没有明显提到该如何解决这一问题,不知是因为觉得太简单了还是其他原因。
2505 0
|
C#
WPF应用程序的启动画面[Splash Screen本质分析]
原文:WPF应用程序的启动画面[Splash Screen本质分析]   不经意间发现了wpf的这个小玩意,感觉蛮有意思的。我在项目中添加了一张图片 如图: wpf-1.JPG(10.73 K)2010-6-6 17:04:47 然后再这张图片的属性中设置它的生成操作为SplashScreen 如图: wpf-2.JPG(13.51 K)2010-6-6 17:04:47 之后f5启动程序,你会发现在你主程序启动之前会出现一个0.5秒的动画,当然这个是默认的,您可以通过程序来进行对它的控制。
1219 0