Win10开发:实现GridView选定项的反选

今天在开发Flickr下载器的时候遇到了要反选GridView选中项的反选问题,花了好一会儿才解决,所以写篇博文记录一下。

我觉得我的实现方法很Low,真的是很愚蠢的办法。不刚好我就是个愚蠢的人,只想到了这么个愚蠢的办法。如果读者有更优的办法欢迎指教。

废话有点多,进入正题。

先说说几个相关的GridView的属性或方法:

属性:

SelectionMode:项的选择模式,有四个可选值。默认为单选,即Single。多选为:Multiple

SelectedItem:获取或设置选定项,可读写

SelectedItems:获取当前选定项,只读。因为GridView的选定项可以为多项,因此需要使用它。

SelectedRanges:获取选定项的范围集合,返回的是个IReadOnlyList<ItemIndexRange>集合。这里的ItemIndexRange有如下三个属性:

可以把ItemIndexRange理解为是个区间,是连续的一段。

方法:

void SelectAll():将列表项全部选中。无参无返回值

void SelectRange(ItemIndexRange itemIndexRange):根据参数itemIndexRange将相应的项选中,无返回值

void DeselectRange(ItemIndexRange itemIndexRange):根据参数itemIndexRange将相应的项取消选中,无返回值

其实介绍完以上几个属性与方法,相信很多人都能想到解决方案了。

XAML:

<GridView x:Name="gridView" SelectionMode="Multiple" ItemsSource="{x:Bind items}">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType="local:Item">
                    <StackPanel Orientation="Horizontal"  Margin="2,0,0,0">
                        <SymbolIcon Symbol="{x:Bind Symbol}"/>
                        <TextBlock Text="{x:Bind Label}" Margin="24,0,0,0" VerticalAlignment="Center"/>
                    </StackPanel>
                </DataTemplate>
            </GridView.ItemTemplate>
</GridView>

items项在C#代码中给出:

private List<Item> items = new List<Item>()
        {
            new Item() { Label = "People", Symbol =  Symbol.People  },
            new Item() { Label = "Globe", Symbol = Symbol.Globe },
            new Item() { Label = "Message", Symbol = Symbol.Message },
            new Item() { Label = "Mail", Symbol = Symbol.Mail },
            new Item() { Label = "CellPhone", Symbol = Symbol.CellPhone },
        };

Item类:

 public class Item
    {
        public string Label { get; set; }
        public Symbol Symbol { get; set; }
    }

以上都不是重点,看下面几行代码:

private void Switch_Click(object sender, RoutedEventArgs e)
      {
            var selectedRanges = gridView.SelectedRanges;
            gridView.SelectAll();
            foreach (var item in selectedRanges)
            {
                gridView.DeselectRange(item);
            }
      }

怎么样,是不是觉得很简单?

然而的是...我是个好人,连代码也要玩玩我。

上面的6行代码并不能实现反选的效果,不信你试试。反正我爆了。

调试之后,发现执行了SelectAll()方法前后,selectedRanges发生了改变。(鬼知道为什么,明明已经赋值了。若有人知道还请告知,万分感谢。)

于是又想出了个解决方案,把selectedRanges做个拷贝,于是就有了下面的方法:

private void Switch_Click(object sender, RoutedEventArgs e)
        {
            var selectedRanges = gridView.SelectedRanges;
            List<ItemIndexRange> tempRanges = new List<ItemIndexRange>();
            //foreach实现拷贝
            foreach (var item in selectedRanges)
            {
                tempRanges.Add(item);
            }

            gridView.SelectAll();

            foreach (var item in tempRanges)
            {
                gridView.DeselectRange(item);
            }
        }

这下终于实现了想要的反选效果,真是机(yu)智(chun)如(zhi)我(ji)啊~~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 06:56:51

Win10开发:实现GridView选定项的反选的相关文章

WP &amp; Win10开发:实现ListView下拉加载的两种方法

1.通过ListView控件的ContainerContentChanging方法.该方法在列表项被实例化时触发,在列表项最后一个项目实例化的时候触发刷新数据逻辑就可以实现下拉加载了. 代码如下://list_ContainerContentChanging在列表项被实例化是触发. private void list_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) { if

基于DevExpress开发的GridView如何实现某一列的一行让用户可以从下列列表选择选项

在很多DevExpress的使用例子里面,我们可以看到,基于GridView实现的不同控件展示的时候,每一列的控件类型都是一样的,如果我要某一列的一行让用户可以从下列列表选择选项,而其他行不可选择,那我们可以实现这种效果吗,应该如何实现? 1.GridView实现的显示效果 例如下面的效果就是我希望达到的,在第一行的流程处理人列允许用户选择,其他行禁止用户选择. 单用户单击第一行的“流程处理人”列的时候,弹出一个列表供用户选择,选择后显示具体的人员的姓名即可. 2.功能实现具体步骤 实现上面所说

Win10开发:学习资料汇总(转)

距离2015.07.29 Windows 10 正式发布已经过去一个多月了.在那之前微软也早已退出Windows 10 SDK,距离目前已经半年过去了. 在Windows8/WindowsPhone时代,开发者的学习资料就比较少,当然只是相对Android和IOS而言的,所以少只是相对的. 在本文中,我将整理一些我在学习Windows10开发过程中找到的一些开发学习资料,跟大家分享.要说明的一点,这些资料不局限于Windows10的,因为很多知识是跟Win8.1/WP8.1相通的. 微软虚拟学院

Android GridView实现全选反选效果

原文:Android GridView实现全选反选效果 源代码下载地址:http://www.zuidaima.com/share/1550463727848448.htm 非常实用的Demo,很多时候都会用到,所以特意上传上来给大家分享. 另外,建议猿们以后上传这种类似可运行的程序源码时,最好都附上截图,这样其他猿也知道是不是自己想要的.

献给那些前端学习迷茫的人 -----前端开发必备的11项技能!!!

你也许会觉得前端开发是一个很简单的工作,对呀,你就是刚刚从网页设计转型过来的.但当你深入其中时,一定会发现好像前端开发不是那么简单,光网站性能优化.响应式.框架就让你焦头烂额, 确实,做前端开发就是先易后难,想成为一个优秀的前端开发,没有那么简单. 不过,天下事难则不会,会则不难,你只需要掌握11项技能就可以成为前端"大拿",下面,就告诉你这11项技能是什么?以及每项技能的要点,最后是相关的专业图书. 入门必备的技能:   第1项技能:HTML超文本标记语言: 技能要点: HTML文件

Js获取下拉框选定项的值和文本

Js获取下拉框的值和文本网上提供了2种方法:但有些人很不负责任,他们根本没考虑到浏览器之间的差异导致的错误,导致很多新手琢磨了半天找不出错误! 下面我总结下Firefox和IE下获取下拉框选定项的值和文本: 1. IE和Firefox都支持的方法: 获取文本 var obj=document.getElementById('select_template'); var text=obj.options[obj.selectedIndex].text;//获取文本 var obj=document

activityGroup怎样让子activity中的gridView第一项默认获取焦点?

如图所示,activityGroup管理四个子activity,每次次进入后,都是左边的TAG栏获取焦点,怎样才能让焦点默认移到右边子activity中GridView容器中的第一个元素? 注:mGridView.setSelection(0);    mGridView.requestFocus();这些方法均无效. 子activity中mGridView.setSelection(0); 不起作用不原因是调用的时机不对.复写一下函数即可解决问题: @Override public void

MFC 获取Combo Box控件 当前选定项的序号和文本内容

代码如下: CString text; // 选定项的文本内容 Combobox m_combobox; // 控件变量 int cindex= m_combobox.GetCurSel(); // 获取选定项的序号 m_combobox.GetLBText(cindex,text); // 获取选定项的文本内容 其中,m_combobox为Combo Box控件变量,可由右键控件添加变量.序号cindex是从0开始的,也就是获取Combox Box控件的第一个项的序号为0. 原文地址:http

Win10怎么添加开机启动项?Win10添加开机自动运行软件三种方法

Win10管理开机启动项的方法相信大家已经非常熟悉,msconfig命令各系统都通用,那么很多用户发觉Win10和Win7 XP等系统不同,没有启动文件夹,那么我们怎么添加开机启动项呢?如晨软件或程序没有开机启动设置的话,是的,在Win10中添加开机启动项虽然麻烦了些,但是还是可以设置的,下面小编就分享几种方法. 方法一:开机启动文件夹 1.我们打开文件夹:C:\Users(用户)\Administrator(当前用户名)\AppData\Roaming\Microsoft\Windows\St